2011-03-07 145 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