2014-11-03 60 views
0

此INSERT查询在VS20012,SQL Server 2008 R2中完美无缺。但是当我尝试从VB代码后面执行它时,我在执行后尝试将值赋给变量的行上出现DBnull转换错误。将参数ID分配给带参数的变量OUTPUT

插入也不成功,但也不会导致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

你应该看看[我们可以停止使用AddWithValue()了吗?( http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)并停止使用'.AddWithValue()' - 它可能会导致意外和令人惊讶结果... – 2014-11-03 21:22:16

回答

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是标识列,并通过某种触发的数据库中不计算)

+0

我知道这应该工作,但我一直收回零。通过在表单上放置Gridview并使用智能标记来配置查询,允许编辑,更新和删除来测试连接,但是此时该查询不会插入记录。 – htm11h 2014-11-03 21:53:55

+0

您需要调试。你从ExecuteScalar回来了什么,或者你得到零?无论如何,我会尽力逐步解决。首先,我只是使用没有任何输出的插入来查看是否添加了记录。然后读取代码以获取OUTPUT或SELECT IDENTITY – Steve 2014-11-03 22:02:56

+0

作为旁注,baseActive和diagActive是位列? – Steve 2014-11-03 22:04:32