2009-10-28 82 views
0

我在一個唯一的列上插入一個插入,系統返回一個錯誤,說我不能插入重複的行。我怎樣才能忽略C#中的這個錯誤?如何忽略SQL錯誤? - C#

編輯 不使用try/catch語句

this question我爲什麼要忽略錯誤。

+0

你爲什麼要忽略它?你最好不要插入重複的行。 – recursive 2009-10-28 03:10:40

+0

我正在實現每個文章ID都有唯一IP的點擊數數據庫。我試圖避免提出兩個疑問。這就是爲什麼我想忽略這些錯誤。 – Luke101 2009-10-28 03:16:12

+0

SQL Server是否支持INSERT ... ON DUPLICATE KEY UPDATE樣式語法?這聽起來像你所需要的。 – 2009-10-28 03:23:24

回答

0

使用Try/Catch並對catch執行任何操作。

當然這意味着記錄不會被插入,也不會像@recursive提到的那樣解決潛在的問題,但它會忽略錯誤。

如果你想插入一個新行然後擺脫導致這種情況發生的屬性值,如Id字段或其他東西。

編輯

如果它是一個命中次數,那麼你想要做一個更新查詢,我認爲是你來自哪裏。你不想做一個檢查,然後插入/更新權利?

我想你可能會更好使用數據存儲庫並將對象保留在內存中。如果有一個id分配給對象,那麼你在計數器上進行更新,如果沒有,那麼插入一個,然後你將ID存儲在對象中。

Google Analytics(分析)可以檢查頁面上的點擊次數? Lot很容易,大多數免費且幾乎沒有代碼。那是可行的嗎?

+0

是否有可能沒有try/catch?我的代碼的這個區域會被執行幾次 – Luke101 2009-10-28 03:16:56

0

如果你想忽略它,抓SQLEXCEPTION把它吞了......

try 
    { 

     // code that calls the database insert 
    } 
    catch(SqlException) { /* swallow */ } 

如果你可以切換到使用一個存儲過程,然後簡單地窩插入一個條件塊,檢查裏面對於受騙者第一...

If Not Exists (Select * From Table 
       Where PK = @PkValue) 
    Insert Table (ColNames here) 
    Values(input parameters here, including PKvalue) 
+1

錯字中的catch – 2009-10-28 03:15:10

+1

什麼?沒有SqException?謝謝!修正它... – 2009-10-28 13:05:29

+0

是否有可能沒有嘗試/趕上?我的代碼的這個區域將被執行多次 – Luke101 2009-10-28 15:42:54

0

用途:

try { 
    ...sql statement execution... 
} catch (SqlException ex) { 
    ..do stuff here... 
} 
+0

是否有可能沒有try/catch?我的代碼的這個區域將被執行多次 – Luke101 2009-10-28 15:41:46

0

實在沒有辦法瓦特/出做一個初始選擇或嘗試捕獲...

如果您使用支持存儲過程的數據庫,則可以通過在存儲過程中執行select操作,然後僅在存在沒有記錄。

還有一篇關於您鏈接到的文章的建議,值得一試,您可以使用where子句編寫插入內容。我不確定語法是否正確,但可能值得一試。

Insert TableName ([column list]) 
Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted 
From TableName 
Where Not Exists 
    (Select * From TableName 
    Where PK == @PK) 
0

以如下方式使用存儲過程。請注意,error_number()來自定義的錯誤 - 當它插入具有唯一鍵的副本或PK約束時。谷歌如果你想了解更多關於具體號碼的細節

BEGIN TRY 
    insert into table values(x,y,x) 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER() = 2627 OR ERROR_NUMBER() = 2601 
      -- this is a duplicate so just do nothing 
    ELSE 
     RAISERROR ('Error with Insert', -- Message text. 
      16, -- Severity. 
      1 -- State. 
      ); 
END CATCH