Нарушение ограничения первичного ключа при чтении - PullRequest
1 голос
/ 07 марта 2011

У меня есть веб-сервис, который имеет несколько методов доступа к данным. Этот конкретный метод только читает данные. Это не делает никаких вставок, обновлений, и никакие триггеры не выполняются, чтобы вызвать вставку или обновление. Мы получили сообщение об ошибке, которая была записана как ограничение нарушения первичного ключа. Как я уже говорил, этот метод ничего не вставляет. Вот стек вызовов:

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 голосов
/ 08 марта 2011

Обычно не рекомендуется вставлять первичный ключ, но разрешать его автоинкремент на стороне БД. Существует системная переменная, которую вы можете вызвать, чтобы получить идентификатор ключа, который был создан по вашему запросу.

Но на самом деле, в зависимости от того, что вы пытаетесь сделать, есть разные способы решения проблемы.

В конце концов, что-то не так с логикой вашей программы, поскольку она пытается вставить неуникальное значение в уникальный столбец.

0 голосов
/ 07 марта 2011

Что-то определенно вставляется, что нарушает ограничение pk. Это может быть журнал использования, журнал ошибок или какой-то другой вид аудиторской таблицы, целью которой является регистрация использования хранимых процедур. Это также может быть функция или хранимая процедура, которая вызывается запросом, который вы ожидаете только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...