[英]ExecuteNonQuery doesn't throw exception on insert
我正在使用OracleCommand.ExecuteNonQuery()插入表中。 一切正常,但有時不插入記錄。 那么ExecuteNonQuery()是否可能不會插入記錄並且也不會引發異常?
我沒有使用存儲過程。 我沒有使用交易。 我正在記錄ExecuteNonQuery()引發的任何異常,但顯然沒有異常引發...我也不在檢查ExecuteNonQuery()的返回值。 但是,如果插入成功,ExecuteNonQuery是否有可能返回另一個值而不是1?
不應該這樣 ExecuteNonQuery返回一個整數,指示受影響的行數。 如果未插入任何行,則應返回0。 無法執行查詢時,應引發異常。 例如:連接已關閉,表不存在,等等。
除非您在某處吞下了異常,否則不會這樣,除非:
try
{
DoSomethingOnTheDbThatMightThrowAnException();
}
catch(Exception ex)
{
// Do nothing, thus swallowing the exception
}
另外,檢查ExecuteNonQuery()
的返回值。 如果為0,則可能要考慮自己引發異常。
這不太可能。
您是否有更高級別的錯誤處理程序,可能會捕獲錯誤並將其丟棄?
“一切正常,但有時不插入記錄。” 可能插入/通過一個視圖,該視圖可以允許您插入實際上看不到的記錄。 虛擬專用數據庫/行級安全性也可以做到這一點。
僅作記錄,我遇到了這個問題。
發生這種情況的原因是,當我從單元格為存儲的proc構建Command參數時,我正在從gridviewcell中連續測試null或DBNull.Value。
像這樣:
if(cell.Value != DBNull.Value && cell.Value != null)
{
//add the parameter to the Command object
}
這意味着當我得到一個空字符串並且當時Convert.ToDecimal沒有引發NumberFormatException時,它正在創建一個參數。
相反,當我嘗試執行cmd.ExecuteNonQuery()時,引發了NumberFormatException。
我猜想當ExecuteNonQuery()啟動時,會在運行時發生轉換。
我通過切換到以下方式修復了它:
if(cell.Value != DBNull.Value &&
!string.IsNullOrEmpty(cell.Value.ToString()))
{
//Create and Add the parameter
}
可能是ExecuteNonQuery()引發了您的try-catch塊未捕獲的異常。 檢查Windows事件日志以確保; 由於您的驅動程序之一崩潰,可能會發生AccessViolationException,並且從.NET 4.0開始的托管代碼中通常無法捕獲這種異常。 在此鏈接上描述了一種解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.