为什么@@ IDENTITY或SCOPE_IDENTITY()是DBNull?

ine*_*ine 1 sql vb.net identity

(已解决:见底部)

我有以下代码片段:

Protected Sub SqlDataSource1_Inserted(ByVal sender As Object, 
ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
Handles SqlDataSource1.Inserted
    affected = CInt(DirectCast(e.Command.Parameters("@affected"), IDbDataParameter).Value)
    newID = CInt(DirectCast(e.Command.Parameters("@newID"), IDbDataParameter).Value)
End Sub
Run Code Online (Sandbox Code Playgroud)

其中@newID在SQL字符串中定义如下:

"INSERT INTO x(a,b,c) VALUES (@a,@b,@c); SELECT @affected = @@rowcount, @newID = SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)

使用ASP.NET定义参数如下:

关于它的奇怪之处在于它可以在90%的时间内工作,但每次都会抛出一个InvalidCastException,说"从类型'DBNull'转换为'Integer'类型无效." 关于什么可能导致这个值为null的任何想法?我没有在表上设置任何触发器,我的查询唯一要做的就是在1个表中运行普通插入.

编辑:根据这里的建议,我添加了一个affected参数.我设置了一个断点,并且受影响= 1但我仍然有例外.但是,我在SELECT @affected之前发现我有SELECT @newID.我切换了顺序,现在@affected = 0.所以看来我的插入语句出现了问题.谢谢你的帮助!

Rus*_*Cam 8

来自MSDN

INSERT,SELECT INTO或批量复制语句完成后,@@ IDENTITY包含该语句生成的最后一个标识值.如果该语句不影响具有标识列的任何表,则@@ IDENTITY将返回NULL.

你有检查插件是否成功?您尝试插入的记录可能由于某种原因未能插入任何内容,因此id为null.

桌子上是否设置了任何触发器?您可能正在使用@@ IDENTITY从触发器过程中检索id

我建议使用SCOPE_IDENTITY()输出参数来获取id