vb.net scope_identity - это DBNull
У меня есть этот код. Я хочу взять идентификатор оператора вставки и сохранить в переменной. Я не могу использовать SqlDataSource, поэтому я могу использовать только DataTableReader, и я не знаком с обработкой SCOPE_IDENTITY в DataTableReader...
Dim sql As String = "insert into tbl_url (url) values ('" & Request.RawUrl & "')"
'Helper is a class of mine, don't mind it
Helper.execQuery(sql)
sql = "select SCOPE_IDENTITY() as id"
Dim dtr As Data.DataTableReader
dtr = Helper.getDataTableReader(sql)
Dim code As Decimal
If dtr.Read Then
code = dtr("id")
End If
dtr.Close()
dtr ("id") - это DBNull... почему?
РЕДАКТИРОВАТЬ:
Как сказал Damien_The_Unbeliever, в Помощнике соединение закрывается, так что это две разные области видимости...
Кто-нибудь знает, как хранить в переменной SCOPE_IDENTITY только с DataTableReader?
1 ответ
Как вы уже указали в своих комментариях, Helper закрывает соединение между двумя запросами, заставляя каждый запрос выполняться в своей области видимости. Вот почему SCOPE_IDENTITY
не находит ваш идентификатор
Есть несколько вариантов:
@@IDENTITY
- Это вернет последний идентификатор, вставленный в любую таблицу в текущем сеансе. Однако это может иметь ту же проблему.
IDENT_CURRENT
- Возвращает последний идентификатор, вставленный в указанную таблицу, в течение любого сеанса. Тем не менее, это не обязательно ваш идентификатор (это может быть другой человек, который делает другую вставку.
У обоих из них есть проблемы, как бы то ни было. Возможно, вам лучше вернуть идентификатор непосредственно из вашего запроса. На заметку о том, что вы не должны объединять свои данные в строку SQL - это открывает для вас атаки SQL инъекций. Вместо этого вы должны использовать Sql Parameters.
Ниже приведен пример, который примерно то, что вам нужно сделать. Очевидно, я закодировал это как прямую ADO.Net - вам нужно выяснить, как это вписывается в ваш класс Helper.
Dim sql As String = "insert into tbl_url (url) values (@url); Select @ID = SCOPE_IDENTITY()"
Dim id As String = String.Empty
Dim sqlcmd As New SqlClient.SqlCommand()
sqlcmd.Connection = New SqlClient.SqlConnection("Your Connection String here")
sqlcmd.Connection.Open()
sqlcmd.CommandText = sql
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("url", Request.RawUrl))
Dim idParam = New SqlClient.SqlParameter("ID", id)
idParam.Direction = ParameterDirection.Output
sqlcmd.Parameters.Add(idParam)
sqlcmd.ExecuteNonQuery()
'Get the Value from the output parameter
id = idParam.Value