powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Identity не возвращается в DataTable
25 сообщений из 44, страница 1 из 2
Identity не возвращается в DataTable
    #38471279
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема, наверное, заезженная, но каменный цветок не выходит.
Делаю по статье: http://msdn.microsoft.com/en-us/library/ks9f57t0(VS.80).aspx

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Dim adapter As SqlDataAdapter 
Dim mRS As DataTable 

Open:

                Using cmd As SqlCommand = CreateCommand(pvsSQLString, False)
                    cmd.CommandType = CommandType.Text

                    mRS = New DataTable
                    adapter = New SqlDataAdapter(cmd)
                    adapter.Fill(mRS)

                    Dim builder As New SqlCommandBuilder(adapter)
                    adapter.DeleteCommand = builder.GetDeleteCommand
                    adapter.UpdateCommand = builder.GetUpdateCommand
                    adapter.InsertCommand = builder.GetInsertCommand

                    If Not mObject Is Nothing Then
                        adapter.InsertCommand.CommandText = adapter.InsertCommand.CommandText & ";select " & GetFields(mObject) &  " from " & mObject.SourceTable & " WHERE " & mObject.PrimaryKey & "=SCOPE_IDENTITY();"
                        adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both
                        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
                        AddHandler adapter.RowUpdated, New SqlRowUpdatedEventHandler(AddressOf OnRowUpdated)
                    End If
                End Using

Update:

            Dim dc As DataTable = mRS.GetChanges
            adapter.Update(dc)
            mRS.Merge(dc)
            mRS.AcceptChanges()

При adapter.Update происходит исполнение insert, данные вставляются, но select не происходит (смотрю профайлер), а после adapter.Update InsertCommand.CommandText возвращается измененный, без селекта.

Что я делаю неправильно?

MSSQL 2008 R2
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471283
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyadapter.InsertCommand.CommandText & ";select " & GetFields(mObject) & " from " & mObject.SourceTable & " WHERE " & mObject.PrimaryKey & "=SCOPE_IDENTITY();"
Мрак...

Уволить без выплаты материального пособия.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471316
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAntonariyadapter.InsertCommand.CommandText & ";select " & GetFields(mObject) & " from " & mObject.SourceTable & " WHERE " & mObject.PrimaryKey & "=SCOPE_IDENTITY();"
Мрак...

Уволить без выплаты материального пособия.Спешным образом переделываю на SqlClient одну библиотеку, которая раньше работала на adodb.dll, где с извлечением identity нет проблем (но есть иные проблемы, например, периодический access violation при обращению к Recordset.Fields(x)), поэтому меня устроит любой рабочий говнокод, укладывающийся в интерфейс библиотеки. К сожалению, EF в разумные сроки туда не укладывается.
А конкретно этот мрачный селект взят из MSDN.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471329
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyК сожалению, EF в разумные сроки туда не укладывается.
Про сроки вообще не понял. Вроде как с EF наоборот быстрее пишется, разве не так?

AntonariyА конкретно этот мрачный селект взят из MSDN.
Да, там много гавнища развелось за все эти годы.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471380
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAntonariyК сожалению, EF в разумные сроки туда не укладывается.
Про сроки вообще не понял. Вроде как с EF наоборот быстрее пишется, разве не так?Так, если с нуля. А если есть 500кб исходников, которые нужно перевести на новые рельсы, то быстро не выйдет. До состояния "компилируется" с adodb на датасеты я их перегнал часа за три, аналогичный переход на EF займет дни.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471397
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

... а mObject точно не Nothing ?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471402
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

А почему в выборке используется строка pvsSQLString, а в InsertCommand.CommandText идёт какое-то построение для выборки?
Эти две строки (выборки) между собой коррелируют?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471449
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carrotikAntonariy,

... а mObject точно не Nothing ?Точно.

Alex KuznetsovА почему в выборке используется строка pvsSQLStringЭто селект для исходного датасета. Alex Kuznetsovа в InsertCommand.CommandText идёт какое-то построение для выборки?Потому что делал по примеру. Там инсерт и селект захардкодены:
Код: vbnet
1.
2.
3.
4.
5.
6.
adapter.InsertCommand = New SqlCommand( _
            "INSERT INTO dbo.Shippers (CompanyName) " & _
            "VALUES (@CompanyName); " & _
            "SELECT ShipperID, CompanyName FROM dbo.Shippers " & _
            "WHERE ShipperID = SCOPE_IDENTITY();", _
            connection)

Инсерт мне строит билдер, я добавляю селект. В профайлер в результате падает лишь инсерт.

Alex KuznetsovЭти две строки (выборки) между собой коррелируют?Если бы вторая выборка происходила, то наверняка. Сейчас они выбирают звездочки.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38471951
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Тогда содержимое
Код: c#
1.
pvsSQLString

и того что получается в результате вызова
Код: c#
1.
adapter.InsertCommand.CommandText = adapter.InsertCommand.CommandText & ";select " & GetFields(mObject) &  " from " & mObject.SourceTable & " WHERE " & mObject.PrimaryKey & "=SCOPE_IDENTITY();"

в студию...
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38472293
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pvsSQLString = "select * from tblState where 1=2"

Результатом вызова adapter.InsertCommand.CommandText является insert, в таблице появляется новая запись, а вот прилепленный select * from tblState WHERE StateID=SCOPE_IDENTITY(); не выполняется. Этот селект в момент adapter.Update(dc) просто отбрасывается, и если после этого посмотреть adapter.InsertCommand.CommandText, то никакого селекта там уже нет, только инсерт.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38472330
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Попробуйте сделать DataSet с адаптером в дизайнере и посмотрите? что там да как...

Вообще? я для подобных вещей использую вложенную процедуру (если БД позволяет), которая производит вставку данных и возвращает соответствующую строку :
например
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
CREATE PROCEDURE [dbo].spInsertVATPercentage
(
	@cCountryCode char(2),
	@dtValidFrom datetime,
	@dtValidTill datetime,
	@dcmPercentage decimal(5, 2)
)
AS
	SET NOCOUNT OFF;

	IF NOT EXISTS(
	  SELECT * FROM [tbVATPercentage]
	  WHERE cCountryCode = @cCountryCode
	  AND (	@dtValidFrom BETWEEN dtValidFrom AND dtValidTill
		OR  @dtValidTill BETWEEN dtValidFrom AND dtValidTill
	  )
	)
	BEGIN

		INSERT INTO [tbVATPercentage] ([cCountryCode], 
						 [dtValidFrom], 
						 [dtValidTill], 
						 [dcmPercentage]
						 ) 
					VALUES (@cCountryCode, 
						 @dtValidFrom, 
						 @dtValidTill, 
						 @dcmPercentage
						);
	
		SELECT	intID, 
			cCountryCode, 
			dtValidFrom, 
			dtValidTill, 
			dcmPercentage 
		  FROM	tbVATPercentage 
		 WHERE	(intID = SCOPE_IDENTITY())

	 END
	 ELSE
	 BEGIN

		SELECT	TOP 0 
			intID, 
			cCountryCode, 
			dtValidFrom, 
			dtValidTill, 
			dcmPercentage 
		FROM	tbVATPercentage 
	 
	 END

...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38472387
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как гляну на эти типизированные датасеты, так сразу появляются рвотные позывы :)
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38472795
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да меня от любых датасетов тошнит, а от этого дизайнера хочется застрелиться.
Даже пробовать не буду, у меня же динамика, проще вручную пробежаться по новым строкам и нагенерить чистых SqlCommand, возвращающих insert+select, в обход этого душного адаптера.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38473741
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДа меня от любых датасетов тошнит, а от этого дизайнера хочется застрелиться.
Даже пробовать не буду, у меня же динамика, проще вручную пробежаться по новым строкам и нагенерить чистых SqlCommand, возвращающих insert+select, в обход этого душного адаптера.
Ну и как, решил задачу-то?

PS. Иногда типизированные датасэты оченна даже шняшные вещи - особлива когда они просты до безобразия и руками программить их лень
А так да, проще сразу вызвать SQLCommand и пробежаться ридером по записям...
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38473780
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov А так да, проще сразу вызвать SQLCommand и пробежаться ридером по записям...
Проще взять в руки EF и будет щастье.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38473823
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAlex Kuznetsov А так да, проще сразу вызвать SQLCommand и пробежаться ридером по записям...
Проще взять в руки EF и будет щастье.Ну, так скажем, не всегда будет ЩАСТЬЕ !!!
В данном случае да, будет щастье, а в случае, ежели к примеру источник вообще не БД, а вэб сервис - то с EF щастье наступает в извращённой форме... в виде собственного провайдера...
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38473903
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovа в случае, ежели к примеру источник вообще не БД, а вэб сервис - то с EF щастье наступает в извращённой форме... в виде собственного провайдера...
Если источник не БД, а веб сервис, то с EF хоть обизвращайся, работать не будет. В этом случае - кодогенерированная прокси служба-класс. Каждой задаче свои инструменты. К чему этот спич?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474023
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Antonariy,

А вы уверены что GetFields(mObject) возвращает список полей через запятую?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474054
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ... Каждой задаче свои инструменты...Абсолютно согласен

МСУК чему этот спич? Да вот сейчас с MVC 4 работаю, по условиям задачи данные будут приходить от и обрабатываться сторонним вэб сервисом (не моим ). Думал, как-бы так прикрутить к этому безобразию EF, ну чтоб почти "как по книжке" , ан нет, "как по книжке" с EF в данном случае не сработаешь - токмо через (___o___), т.е. свой провайдер
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474132
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovAntonariyДа меня от любых датасетов тошнит, а от этого дизайнера хочется застрелиться.
Даже пробовать не буду, у меня же динамика, проще вручную пробежаться по новым строкам и нагенерить чистых SqlCommand, возвращающих insert+select, в обход этого душного адаптера.
Ну и как, решил задачу-то?Пока нет, случайно удалось вправить мозги adodb. Рекордсет из создающей его процедуры передавался через свойство моего класса, а когда стал возвращать его напрямую, глюки исчезли. Мистика, блеать, причем проявляющаяся только в случае, когда выполняется хранимка, использующая sp_cursoropen + sp_cursorfetch + sp_cursorclose. Процедура возвращает набор записей, и при перемещению по нему рекордсет в рандомный момент либо ВНЕЗАПНО оказывался закрытым либо выдавал access violation при обращении к полю. Причем, если между вызовами MoveNext происходят еще какие-то запросы к базе, глюк практически гарантирован. Я даже пробовал создавать чистенький дубль рекордсета в памяти, чтобы вообще никакой связи с базой, все равно глючило.

Cat2А вы уверены что GetFields(mObject) возвращает список полей через запятую?Она возвращала звездочку. А тут обязательно перечисление полей?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474153
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovДа вот сейчас с MVC 4 работаю, по условиям задачи данные будут приходить от и обрабатываться сторонним вэб сервисом (не моим ). Думал, как-бы так прикрутить к этому безобразию EF, ну чтоб почти "как по книжке" , ан нет, "как по книжке" с EF в данном случае не сработаешь - токмо через (___o___), т.е. свой провайдер
Ну так делай свой IDataContext отдельным проектом, через IoC общайся с ним из основного MVC приложения. Всё тоже самое, по сути. Только прокси службу по WSDL тебе сгенерит не EF, а Service Reference генератор.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474211
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAlex Kuznetsovskiped...
Ну так делай свой IDataContext отдельным проектом, через IoC общайся с ним из основного MVC приложения. Всё тоже самое, по сути. Только прокси службу по WSDL тебе сгенерит не EF, а Service Reference генератор.Делать свой IDataContext ещё то извращение... Лучше уж свои модели реализующие IEnumerable и скрывающие обращение к вэб сервисам...
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474241
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AntonariyА тут обязательно перечисление полей?
Необязательно, но если поля бы были без разделения, то именно такая ошибка и была.
Текст-то запроса собирает правильно?
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474269
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2AntonariyА тут обязательно перечисление полей?
Необязательно, но если поля бы были без разделения, то именно такая ошибка и была.
Текст-то запроса собирает правильно?Инсерт правильно, запись-то вставляется. Вот селект:
Код: sql
1.
select * from tblState WHERE StateID=SCOPE_IDENTITY();

Не знаю, что тут может быть не правильно.
...
Рейтинг: 0 / 0
Identity не возвращается в DataTable
    #38474277
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я бы все же попробовал с Output-параметрами.

Например

adapter.InsertCommand.Parameters.Add("@CompanyName", SqlDbType.Varcahr, 400);
adapter.InsertCommand.Parameters.Add("@ShipperID", SqlDbType.Int);
adapter.InsertCommand.Parameters["@ShipperID"].Direction = ParameterDirection.Output;

Текст запроса:

INSERT INTO dbo.Shippers (CompanyName) VALUES (@CompanyName);
@ShipperID = SCOPE_IDENTITY()
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Identity не возвращается в DataTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]