Возможно ли получить значение столбца IDENTITY при вставке, используя SqlCommandBuilder (без использования Stored Proc)? - PullRequest
14 голосов
/ 26 сентября 2008

К вашему сведению: я работаю на dotnet 3.5 SP1

Я пытаюсь получить значение столбца идентификаторов в моем наборе данных после выполнения обновления (используя SqlDataAdapter и SqlCommandBuilder). После выполнения SqlDataAdapter.Update (myDataset) я хочу иметь возможность прочитать автоматически назначенное значение myDataset.tables(0).Rows(0)("ID"), но это System.DBNull (несмотря на тот факт, что строка была вставлена).

(Примечание. Я не хочу явно писать новую хранимую процедуру для этого!)

Один часто публикуемый метод http://forums.asp.net/t/951025.aspx изменяет SqlDataAdapter.InsertCommand и updatedRowSource следующим образом:

SqlDataAdapter.InsertCommand.CommandText += "; SELECT MyTableID = SCOPE_IDENTITY()"
InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord

По-видимому, в прошлом это, казалось, работало для многих людей, но не работает для меня.

Другой метод: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=619031&SiteID=1 у меня тоже не работает, так как после выполнения SqlDataAdapter.Update коллекция SqlDataAdapter.InsertCommand.Parameters сбрасывается на исходную (теряется дополнительный добавленный параметр).

Кто-нибудь знает ответ на этот вопрос?

Ответы [ 13 ]

0 голосов
/ 17 марта 2015

На самом деле, это даже проще, не нужно никаких пользовательских команд. При создании адаптера таблицы в конструкторе набора данных укажите «обновить таблицу данных» в дополнительных параметрах мастера. После этого после того, как вы выполните dataadapter.update mydataset, вы найдете столбец идентификации в таблице данных, заполненный новым значением из базы данных.

0 голосов
/ 02 сентября 2011

Другой способ, используя только командный объект.

Dim sb As New StringBuilder
sb.Append(" Insert into ")
sb.Append(tbl)
sb.Append(" ")
sb.Append(cnames)
sb.Append(" values ")
sb.Append(cvals)
sb.Append(";Select SCOPE_IDENTITY() as id") 'add identity selection

Dim sql As String = sb.ToString

Dim cmd As System.Data.Common.DbCommand = connection.CreateCommand
cmd.Connection = connection
cmd.CommandText = sql
cmd.CommandType = CommandType.Text
cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord

'retrieve the new identity value, and update the object
Dim dec as decimal = CType(cmd.ExecuteScalar, Decimal)
0 голосов
/ 02 октября 2008

Вы рассматривали возможность использования LINQ вместо этого? Я понимаю, что это не относится к вашему актуальному вопросу, но если вы используете .NET 3.5, вам действительно стоит попробовать использовать LINQ. Фактически, с появлением Code First EntityFramework, я думаю, вы могли бы легко выбрать либо LINQ to SQL, либо EF в качестве относительно легкой альтернативы развертыванию собственного DAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...