0

此 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

任何关于我做错了什么的想法将不胜感激。

4

1 回答 1

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 列并且不是由数据库中的某种触发器计算的)

于 2014-11-03T20:59:40.930 回答