vb.net scope_identity是DBNull

时间:2014-05-22 11:58:23

标签: asp.net vb.net scope-identity

我有这个代码。我想获取insert语句的id并存储在变量中。 我不能使用SqlDataSource所以我只能使用DataTableReader而且我不熟悉在DataTableReader中处理SCOPE_IDENTITY ......

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所说,在Helper连接关闭,所以这些是两个不同的范围......

是否有人知道如何仅使用DataTableReader将SCOPE_IDENTITY存储在变量中?

1 个答案:

答案 0 :(得分:1)

正如您在评论中已经确定的那样,Helper正在关闭两个查询之间的连接,导致每个查询在其自己的范围内执行。这就是SCOPE_IDENTITY无法找到您的ID的原因。

有几种选择:

@@IDENTITY - 这将返回当前会话中任何表中插入的最后一个ID。但是,这可能会有同样的问题。

IDENT_CURRENT - 返回在任何会话中插入指定表的最后一个ID。但是,这不一定是您的 ID(可能是另一个人正在进行另一次插入。

然而,这两个都有问题。您可能最好直接从查询中返回ID。在相关的说明 - 您不应该将您的数据连接到SQL字符串 - 这将打开您的SQL注入攻击。相反,您应该使用Sql参数。

以下是您需要做的大致示例。显然,我已将此编码为直接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