这个INSERT查询在VS20012,SQL Server 2008 R2中完美运行。但是当我尝试从后面的VB代码执行它时,我在行上尝试DBnull Conversion错误,试图在执行后将值赋值给变量。
插入也不成功,但也不会导致Try Catch出错。即使在连接关闭后也是如此非常奇怪的行为。
sqSql = "INSERT INTO tblLogging (vein, num, descripBaseFileName, " & _
" csvBaseFileName, baseActive, diagActive) " & _
" OUTPUT INSERTED.keyID" & _
" VALUES (@vein, @num, @cnfFil, @csvFil, 'True', 'False')"
command3.Parameters.AddWithValue("@vein", vein1)
command3.Parameters.AddWithValue("@num", veinNum)
command3.Parameters.AddWithValue("@cnfFil", cnfFil)
command3.Parameters.AddWithValue("@csvFil", csvFil)
command3.Parameters.Add("@keyID", SqlDbType.Int)
command3.Parameters("@keyID").Direction = ParameterDirection.Output
Try
command3.CommandText = sqSql
oCnn.Open()
command3.ExecuteScalar()
oCnn.Close()
错误在这里:
**Dim retkeyID As Integer = command3.Parameters("@keyID").Value**
Catch ex As Exception
Throw ex
End Try
对于我所做错的任何想法都将不胜感激。
答案 0 :(得分:1)
在您的上下文(具有单个返回值的单个插入)中,您不需要输出参数来获取OUTPUT子句的值。
您只需转换ExecuteScalar的返回值
Dim result = Convert.ToInt32(command3.ExecuteScalar())
如果您确实想使用@keyID
输出参数,则需要在退出查询之前进行设置。
sqSql = "INSERT INTO tblLogging (vein, num, descripBaseFileName, " & _
" csvBaseFileName, baseActive, diagActive) " & _
" VALUES (@vein,@num,@cnfFil,@csvFil,'True', 'False'); " & _
"SELECT @KeyID = SCOPE_IDENTITY(); "
(当然这假设KeyID是一个IDENTITY列,不是由数据库中的某种触发器计算的)