2011-03-07 161 views
1

我有一個Web服務,它有一些數據訪問方法。這種特殊的方法只能讀取數據。它不會執行任何插入,更新,也不會執行任何觸發器以導致插入或更新。我們有一個錯誤報告記錄爲違反主鍵約束。正如我之前所說的,這種方法不會插入任何東西。這裏是調用堆棧:違反主鍵約束讀取

The METHOD_NAME() method failed with an unhandled exception. 
[EXCEPTIONS] #1:SqlException(Violation of PRIMARY KEY constraint 'CONSTRAINT_NAME'. Cannot insert duplicate key in object 'dbo.TABLE_NAME'. 
The statement has been terminated.) [SITE] Logged in Anon.DLL [DETAILS] Level=Error 
[STACK] at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader() 
    at Anon.DataAccess.Common.DataAccessBase`4.ExecuteReader() in Anon\DataAccessBase.cs:line 183 
    at Anon.DataAccess.GetSomething() in Anon\SomethingDal.cs:line 31 
    at Anon.Service.Manager.GetSomething() in Anon\Manager.cs:line 53 
    at Anon.WebService.GetSomething() in Anon\WebService.asmx.cs:line 47 

有此服務的其他方法可能會產生錯誤,但他們將不得不需單獨調用。當我只進行讀取時,如何獲得插入錯誤?這兩種方法是否可能同時運行,並將錯誤報告給錯誤的連接?

這工作正常99.9999%的時間,但這一次有些東西被交叉了。

+2

沒有臨時表嗎? – 2011-03-07 19:59:04

+2

你在調用存儲過程嗎?您是否使用過SQL Profiler查看究竟調用了什麼? – Oded 2011-03-07 20:00:16

+0

我正在調用存儲過程。我無法重現此錯誤,但它肯定是記錄的。沒有臨時表。 – 2011-03-07 20:44:07

回答

0

某些東西肯定是插入的是違反pk約束。它是一個使用日誌,錯誤日誌或其他類型的審計表,其目的是記錄存儲過程的使用情況。它也可以是一個函數或存儲過程,由您希望只讀的查詢調用。

+0

記錄在錯誤消息中的表格是我正在讀取的表格。這絕對不是一個日誌表等 – 2011-03-07 20:46:59

+0

那麼你不能得到這個錯誤,除非某處某處正在嘗試插入/更新。我知道你認爲你是100%積極的沒有更新正在進行,但某處必須有一個偷偷摸摸的更新。另外,我建議將PK設置爲DB側的標識列。不要在可能的情況下設置PK。 – Chev 2011-03-07 23:41:41

+0

絕對如此。 SQL選擇查詢本身從不在任何數據庫服務器上插入數據,包括SQL Server – 2011-03-08 14:36:38

0

插入主鍵通常不是一個好主意,而是讓它在DB側自動遞增。有一個系統變量可以調用以獲取由查詢創建的密鑰的ID。

但是,實際上,取決於你想要做什麼,有不同的方法來解決這個問題。

最後,您的程序邏輯有些問題,因爲它試圖將非唯一值插入到唯一列中。

+0

我不想在此SQL語句中插入任何內容。我有另一個WebMethod實際上做插入。這工作正常99.9999%的時間,但有一次我看到這條消息記錄。 – 2011-03-07 21:17:20

+0

聽起來像web方法是手動嘗試設置下一個PK值。你可能只發生過一次,因爲這是一種競爭條件。我沒有使用網絡方法,所以我很抱歉,我無法幫助更多。 – Bengie 2011-03-07 21:50:49