2009-12-02 57 views
3

我正在使用OracleCommand.ExecuteNonQuery()插入到表中。一切工作正常,但偶爾記錄不插入。 那麼有可能ExecuteNonQuery()不插入記錄,也不會引發異常?ExecuteNonQuery不會在插入時拋出異常

我沒有使用存儲過程。 我沒有使用交易。 我記錄了ExecuteNonQuery()拋出的任何異常,但顯然沒有拋出異常...... 我也是而不是檢查ExecuteNonQuery()的返回值。但是,如果插入成功,ExecuteNonQuery可能返回的值是否大於1?

+0

這是在代碼事務內完成的嗎?也許交易沒有被提交。 – 2009-12-02 15:19:35

+0

_why_他們沒有插入的原因會很有趣......也許你可以發佈插入語句。 – Bobby 2009-12-02 15:23:36

+0

幾年後,但我遇到了與4.0 Oracle.DataAccess組件相同的問題。 ExecuteNonQuery在發生錯誤時不會引發異常,並會在該行後停止執行任何代碼。 – 2012-04-20 18:14:06

回答

3

它不應該。 ExecuteNonQuery返回一個整數,表示受影響的行數。如果沒有插入行,則應返回0。它在執行查詢失敗時應該拋出異常。 E.x .:連接關閉,表格不存在等。

+0

是否有任何文檔說明檢查異常是否足以知道(INSERT,UPDATE,DELETE)操作的錯誤?我可以忽略返回值,只依賴於catch語句。另外,在MSDN文檔中,它聲明在.NET 1.1中不會拋出異常,但是它沒有聲明在以後肯定會拋出異常。 – Nap 2010-02-26 05:10:28

1

這是不太可能的。

您是否有更高級別的錯誤處理程序可能會捕獲錯誤並將其丟棄?

2

除非你正在某處吞嚥異常,如:

try 
{ 
    DoSomethingOnTheDbThatMightThrowAnException(); 
} 
catch(Exception ex) 
{ 
    // Do nothing, thus swallowing the exception 
} 

此外,檢查的ExecuteNonQuery()返回值。如果它是0,你可能要考慮自己拋出一個異常。

1

「一切工作正常,但偶爾記錄沒有插入。」 可能插入/通過一個視圖,它可以讓你插入你實際看不到的記錄。虛擬專用數據庫/行級安全也可以做到這一點。

0

只是爲了記錄我有這個問題。

發生這種情況是因爲我在爲單元格中的存儲過程構建命令參數時,正在爲一行中的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 
} 
0

這可能是的ExecuteNonQuery()拋出不是由你的try-catch塊捕獲的異常。檢查您的Windows事件日誌以確保; AccessViolationException可能發生是由於您的某個驅動程序崩潰,並且這種異常通常無法在.NET 4.0以上的託管代碼中捕獲。在這個link上描述了一個解決方案。