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
Другие вопросы по тегам