使用参数OUTPUT将ID分配给变量

时间:2014-11-03 20:52:17

标签: vb.net tsql sql-server-2008-r2 output-parameter

这个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

对于我所做错的任何想法都将不胜感激。

1 个答案:

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