2014-11-03 86 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

相關問題