【发布时间】:2014-03-12 09:33:54
【问题描述】:
(已解决:见底部)
我有以下代码sn-p:
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' 的转换无效。”关于什么可能导致该值为空的任何想法?我没有在表上设置任何触发器,我的查询唯一要做的就是将普通插入运行到 1 个表中。
编辑:根据此处的建议,我添加了一个affected 参数。我设置了一个断点,并影响 = 1,但我仍然得到了异常。但是,然后我发现我在 SELECT @affected 之前有 SELECT @newID。我切换了顺序,现在@affected = 0。所以这似乎是我的插入语句的问题。感谢您的帮助!
【问题讨论】:
-
目标表上是否有触发器?
-
您需要发布整个查询。
-
发生错误时,该行是否被插入到表中??
-
@amdfan - 我认为您在 SQL 字符串中设置 @@ROWCOUNT 的方式存在问题;它将返回 1,因为它是一个全局变量,并将引用最后一条语句,即 SELECT @newID = @@IDENTITY。简单的分配将返回 1 ...
-
啊,你现在已经编辑了你的 SQL 字符串了!