SQLCE: Почему я получаю ошибку повторяющегося значения? В поле включена идентификация?

В моем запросе я не использую поле первичного ключа, потому что включен параметр идентификации.

   string sql = @"
                  INSERT INTO [tblTemplates] (personID, hash, data) 
                      VALUES (@personID, @hash, @data)";

   cmd = new SqlCeCommand(sql, cn);
   cmd.Parameters.AddWithValue("@personID", newTemplate.personID);
   cmd.Parameters.AddWithValue("@hash", newTemplate.templateHash);
   cmd.Parameters.AddWithValue("@data", newTemplate.templateData);

   cmd.ExecuteNonQuery();

Случайно я могу или не могу вставить запись, а затем возникает исключение:

Повторяющееся значение не может быть вставлено в уникальный индекс.
[Table name = tblTemplates, Constraint name = PK_ tblTemplates _templateID]

Это схема таблицы:

-- Script Date: 26.08.2011 10:37  - Generated by ExportSqlCe version 3.5.1.5
CREATE TABLE [tblTemplates] (
  [templateID] int NOT NULL  IDENTITY (1,1)
, [hash] nvarchar(100) NOT NULL
, [data] image NOT NULL
, [personID] int NOT NULL
);
GO
ALTER TABLE [tblTemplates] ADD CONSTRAINT [PK__tblTemplates__templateID] PRIMARY KEY ([templateID]);
GO
CREATE INDEX [IDX_tblTemplates_personID] ON [tblTemplates] ([personID] ASC);
GO
CREATE UNIQUE INDEX [UQ__tblTemplates__templateID] ON [tblTemplates] ([templateID] ASC);
GO

Почему я получаю эту ошибку?


person Nime Cloud    schedule 26.08.2011    source источник
comment
Потому что столбец PK никогда не может иметь повторяющихся записей. Но я уверен, что вы ожидаете гораздо большего, но из вашего вопроса не ясно.   -  person Zenwalker    schedule 26.08.2011
comment
Это единственный код, который записывает в таблицу? Или это могут быть другие люди / приложения? Была ли таблица пустой при запуске или в ней были какие-либо данные (возможно, импортированные из БД более старого приложения)   -  person Paolo Falabella    schedule 26.08.2011
comment
Вам не нужен UQ__tblTemplates__templateID, потому что первичный ключ является уникальным.   -  person gbn    schedule 26.08.2011
comment
также, если ваше приложение многопоточное, это может быть ошибка в SQL CE   -  person Paolo Falabella    schedule 26.08.2011


Ответы (2)


Похоже на ошибку!

Обходной путь: работает преобразование типа данных поля из int в uniqueidentifier.

Мои попытки обхода:

Попытка №1: То же соединение

        bool executed = false;
        int counter = 0;

        while (!executed)
        {
            try
            {
                cmd.ExecuteNonQuery();
                succes = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("SERVER> (Error) Exception in AddTemplate() {0},{1}", ex.Source, ex.Message);
                System.Threading.Thread.Sleep(100);
            }

            counter++;

        }

Результат. Это похоже на бесконечный цикл.

Попытка №2: Новое соединение

            try
            {
                cmd.ExecuteNonQuery();
                succes = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("SERVER> (Error) Exception in AddTemplate() {0},{1}", ex.Source, ex.Message);
                System.Threading.Thread.Sleep(100);
                AddTemplate(newTemplate); //Warning: Recursive call!
            }

Результат. Эта попытка помогла после нескольких рекурсивных вызовов.

person Nime Cloud    schedule 28.08.2011
comment
Отказ от автоматически назначаемых идентификаторов и использование uniqueidentifier / Guid, похоже, «устранил» эту проблему для меня. - person danw; 19.03.2013

У меня была аналогичная проблема. Я использовал IDENTITY_INSERT на своем столе как

SET IDENTITY_INSERT MyTable ON;
-- some identity insert on MyTable
SET IDENTITY_INSERT MyTable OFF;

После этого все вставки на MyTable выдают ошибку "повторяющееся значение".

Решение этой проблемы было

var cmd = Connection.CreateCommand();                
cmd.CommandText = "SELECT MAX([Id] ) + 1 from [MyTable]";
object i = cmd.ExecuteScalar();
if (i != null && i is int)
{
    cmd.CommandText = "ALTER TABLE [MyTable] ALTER COLUMN [Id] IDENTITY (" + i + ",1)";
    cmd.ExecuteNonQuery();
}
person Hacko    schedule 10.10.2016