(已解决:见底部)
我有以下代码片段:
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
其中@newID在SQL字符串中定义如下:
"INSERT INTO x(a,b,c) VALUES (@a,@b,@c); SELECT @affected = @@rowcount, @newID = SCOPE_IDENTITY();
使用ASP.NET定义参数如下:
关于它的奇怪之处在于它可以在90%的时间内工作,但每次都会抛出一个InvalidCastException,说"从类型'DBNull'转换为'Integer'类型无效." 关于什么可能导致这个值为null的任何想法?我没有在表上设置任何触发器,我的查询唯一要做的就是在1个表中运行普通插入.
编辑:根据这里的建议,我添加了一个affected
参数.我设置了一个断点,并且受影响= 1但我仍然有例外.但是,我在SELECT @affected之前发现我有SELECT @newID.我切换了顺序,现在@affected = 0.所以看来我的插入语句出现了问题.谢谢你的帮助!
来自MSDN
INSERT,SELECT INTO或批量复制语句完成后,@@ IDENTITY包含该语句生成的最后一个标识值.如果该语句不影响具有标识列的任何表,则@@ IDENTITY将返回NULL.
你有检查插件是否成功?您尝试插入的记录可能由于某种原因未能插入任何内容,因此id为null.
桌子上是否设置了任何触发器?您可能正在使用@@ IDENTITY从触发器过程中检索id
我建议使用SCOPE_IDENTITY()或输出参数来获取id