繁体   English   中英

vb.net scope_identity是DBNull

[英]vb.net scope_identity is DBNull

我有这个代码。 我想获取插入语句的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存储在变量中?

正如您已经在注释中标识的那样,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM