[英]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.