在读取时违反主键约束

时间:2011-03-07 19:56:08

标签: c# sql

我有一个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 个答案:

答案 0 :(得分:0)

肯定会插入违反pk约束的内容。它是一个使用日志,错误日志或其他类型的审计表,其目的是记录存储过程的使用情况。它也可以是您希望只读的查询调用的函数或存储过程。

答案 1 :(得分:0)

插入主键通常不是一个好主意,但要让它在数据库端自动增加。您可以调用一个系统变量来获取查询创建的密钥的ID。

但实际上,根据你想要做的事情,有不同的方法来解决这个问题。

最后,程序逻辑出现问题,因为它试图将非唯一值插入到唯一列中。