2016-05-16 2 views
0

У меня есть следующий код:Нарушение первичного ключа ошибки ограничения при UPDATE

using (var connection = new SqlConnection(connetionString)) 
{ 
    try 
    { 
     connection.Open(); 
    } 
    catch(Exception e)  
    { 
     Console.WriteLine(e.Message); 
    } 

    Console.WriteLine("DatabasConnection Done"); 

    DateTime datum = DateTime.Now; 
    string LastChangedBy = "System"; 

    foreach (Person p in myPersons) 
    { 
     SqlCommand command1 = new SqlCommand(); 

     try 
     { 
      command1 = Avreg(p.UnregistrationReason, p.GivenNameNumber, p.ProtectedIdentity, p.CitizenshipDate, connection); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

     Console.WriteLine("LALALALA Done"); 

     command1.Parameters.AddWithValue("@PersonalIdentityNumber", string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber)); 
     command1.Parameters.AddWithValue("@FirstName", p.FirstName ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@LastName", p.LastName ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationCountyCode", p.NationalRegistrationCountyCode ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationMunicipalityCode", p.NationalRegistrationMunicipalityCode ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationDistributionAddress1", p.NationalRegistrationDistributionAddress1 ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationDistributionAddress2", p.NationalRegistrationDistributionAddress2 ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationPostCode", p.NationalRegistrationPostCode ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationCity", p.NationalRegistrationCity ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@BirthCountyCode", p.BirthCountyCode ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@UnregistrationDate", p.UnregistrationDate ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@BirthParish", p.BirthParish ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@CitizenshipCode", p.CitizenshipCode ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@CitizenshipDate", p.CitizenshipDate ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@NationalRegistrationDate", p.NationalRegistrationDate ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@ForeignDistrubtionAddress1", p.ForeignDistrubtionAddress1 ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@ForeignDistrubtionAddress2", p.ForeignDistrubtionAddress2 ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@ForeignDistrubtionAddress3", p.ForeignDistrubtionAddress3 ?? DBNull.Value.ToString()); 
     //command1.Parameters.AddWithValue("@ForeignBirthCity", p.ForeignBirthCity ?? DBNull.Value.ToString()); 

     //command1.Parameters.AddWithValue("@LastChangedBy", LastChangedBy); 
     //command1.Parameters.AddWithValue("@LastChangedDate", datum); 

     command1.ExecuteNonQuery(); 

     Console.WriteLine(string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber)); 
    } 
     } 

      Console.WriteLine("Done"); 
      Console.WriteLine("Alla fält uppdaterade"); 

     Console.ReadKey(); 

      }// Put a break-point here, then mouse-over PersonalIdentityNumber... deserializedList contains everything if you need it 
      catch (Exception e) 
      { 

       Console.Write(" ---- FEL VID INLÄSNINGEN ------ " + e.Message); 
       Console.ReadKey(); 
      } 

     } 






     public static SqlCommand Avreg(string s, string t, string p, string c, SqlConnection connection) 
     { 
      try 
      { 


      var query = "UPDATE Seamen SET FirstName = @FirstName";//, "+ 
       //"LastName = @LastName, "+ 
       //"NationalRegistrationCountyCode = @NationalRegistrationCountyCode, "+ 
       //"NationalRegistrationMunicipalityCode = @NationalRegistrationMunicipalityCode, "+ 
       //"NationalRegistrationDistributionAddress1 = @NationalRegistrationDistributionAddress1, "+ 
       //"NationalRegistrationDistributionAddress2 = @NationalRegistrationDistributionAddress2, "+ 
       //"UnregistrationDate = @UnregistrationDate, "+ 
       //"NationalRegistrationPostCode = @NationalRegistrationPostCode, "+ 
       //"NationalRegistrationCity = @NationalRegistrationCity, "+ 
       //"BirthCountyCode = @BirthCountyCode, "+ 
       //"BirthParish = @BirthParish, "+ 
       //"CitizenshipCode = @CitizenshipCode, "+ 
       //"CitizenshipDate = @CitizenshipDate, " + 
       //"NationalRegistrationDate = @NationalRegistrationDate, "+ 
       //"ForeignDistrubtionAddress1 = @ForeignDistrubtionAddress1, "+ 
       //"ForeignDistrubtionAddress2 = @ForeignDistrubtionAddress2, "+ 
       //"ForeignDistrubtionAddress3 = @ForeignDistrubtionAddress3, "+ 
       //"ForeignBirthCity = @ForeignBirthCity, "+ 
       //"LastChangedBy = @LastChangedBy, "+ 
       //"LastChangedDate = @LastChangedDate"; 

      SqlCommand command1; 



      if (c == "0") 
      { 
       query += ", CitizenshipDate = null"; 
       command1 = new SqlCommand(query, connection); 




      } 
      else 
      { 
       query += ", CitizenshipDate = @CitizenshipDate"; 
       command1 = new SqlCommand(query, connection); 

       command1.Parameters.AddWithValue("@CitizenshipDate", c ?? DBNull.Value.ToString()); 

      } 


      if (p == "J") 
      { 

       query = "UPDATE Seamen SET FirstName ='Skyddad personuppgift'";//, " + 
       //"LastName = 'Se hjälptext', " + 
       //"ProtectedIdentity = '1', " + 
       //"NationalRegistrationCountyCode = NULL, " + 
       //"NationalRegistrationMunicipalityCode = NULL, " + 
       //"NationalRegistrationCoAddress = NULL, " + 
       ////"NationalRegistrationDistributionAddress1 = NULL, " + 
       ////"NationalRegistrationDistributionAddress2 = NULL, " + 
       //"UnregistrationDate = NULL, " + 
       //"NationalRegistrationPostCode = NULL, " + 
       //"NationalRegistrationCity = NULL, " + 
       //"BirthCountyCode = NULL, " + 
       //"BirthParish = NULL, " + 
       //"CitizenshipCode = NULL, " + 
       // //"CitizenshipDate = @CitizenshipDate, " + 
       //"NationalRegistrationDate = NULL, " + 
       //"ForeignDistrubtionAddress1 = NULL, " + 
       //"ForeignDistrubtionAddress2 = NULL, " + 
       //"ForeignDistrubtionAddress3 = NULL, " + 
       //"UnregistrationReason = NULL, " + 
       //"ForeignBirthCity = NULL, " + 
       //"LastChangedBy = @LastChangedBy, " + 
       //"GivenNameNumber = NULL, " + 
       //"LastChangedDate = @LastChangedDate WHERE PersonalIdentityNumber = @PersonalIdentityNumber"; 



       command1 = new SqlCommand(query, connection); 
       command1.Parameters.Clear(); 
       return command1; 
      } 

      if ((!string.IsNullOrEmpty(s)) && !string.IsNullOrEmpty(t)) 
      { 
       query += ", UnregistrationReason = @UnregistrationReason"; 
       query += ", GivenNameNumber = @GivenNameNumber "; 

       command1 = new SqlCommand(query, connection); 

       command1.Parameters.AddWithValue("@UnregistrationReason", s ?? DBNull.Value.ToString()); 
       command1.Parameters.AddWithValue("@GivenNameNumber", t ?? DBNull.Value.ToString()); 

      } 
      else if (!string.IsNullOrEmpty(s) && string.IsNullOrEmpty(t)) 
      { 
       query += ", UnregistrationReason = @UnregistrationReason, GivenNameNumber = @GivenNameNumber WHERE PersonalIdentityNumber = @PersonalIdentityNumber"; 
       command1 = new SqlCommand(query, connection); 

       t = "00"; 
       command1.Parameters.AddWithValue("@UnregistrationReason", s ?? DBNull.Value.ToString()); 
       command1.Parameters.AddWithValue("@GivenNameNumber", t ?? DBNull.Value.ToString()); 

      } 

      else if (string.IsNullOrEmpty(s) && !string.IsNullOrEmpty(t)) 
      { 
       query += ", GivenNameNumber = @GivenNameNumber WHERE PersonalIdentityNumber = @PersonalIdentityNumber"; 
       command1 = new SqlCommand(query, connection); 

       command1.Parameters.AddWithValue("@GivenNameNumber", t ?? DBNull.Value.ToString()); 

      } 
      else 
      { 

        query += ", GivenNameNumber = @GivenNameNumber WHERE PersonalIdentityNumber = @PersonalIdentityNumber"; 
        t = "00"; 
        command1 = new SqlCommand(query, connection); 

        command1.Parameters.AddWithValue("@GivenNameNumber", t ?? DBNull.Value.ToString()); 

        return command1; 

      } 
      return command1; 

     } 


     catch(Exception e) 
    { 
     throw; 
    } 
} 
//} 

Ошибка возникает здесь:

command1.Parameters.AddWithValue("@PersonalIdentityNumber", string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber)); 
command1.Parameters.AddWithValue("@FirstName", p.FirstName ?? DBNull.Value.ToString()); 
//command1.Parameters.AddWithValue("@LastName", p.LastName ?? DBNull.Value.ToString()); 

command1.ExecuteNonQuery(); 

Console.WriteLine(string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber)); 

Я получаю сообщение об ошибке:

Violation of Primary key constraint 'PK_logSeamen'. Cannot insert duplicate key in object 'dbo.logSeamen'. The statement has been terminated.

мне нужно делать необходимо очистить SqlCommand?

Apperently Я имел этот триггер

USE [Bums] 
GO 
/****** Object: Trigger [dbo].[trSeamen_LogI] Script Date: 05/16/2016 11:43:58 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[trSeamen_LogI] ON [dbo].[Seamen] AFTER INSERT AS 
INSERT INTO [logSeamen] ([PersonalIdentityNumber], [ProtectedIdentity], [ReferedCivicRegistrationNumber], [UnregistrationReason], [UnregistrationDate], [MessageComputerComputer], [GivenNameNumber], [FirstName], [MiddleName], [LastName], [NotifyName], [NationalRegistrationDate], [NationalRegistrationCountyCode], [NationalRegistrationMunicipalityCode], [NationalRegistrationCoAddress], [NationalRegistrationDistributionAddress1], [NationalRegistrationDistributionAddress2], [NationalRegistrationPostCode], [NationalRegistrationCity], [NationalRegistrationNotifyDistributionAddress], [NationalRegistrationNotifyPostCode], [NationalRegistrationNotifyCity], [ForeignDistrubtionAddress1], [ForeignDistrubtionAddress2], [ForeignDistrubtionAddress3], [ForeignDistrubtionCountry], [ForeignDate], [BirthCountyCode], [BirthParish], [ForeignBirthCity], [CitizenshipCode], [CitizenshipDate], [Email], [Telephone], [Mobiletelephone], [Gender], [NotNewsPaper], [Note], [StatusCode], [NationalRegistrationCode], [RegistrationDate], [LastUpdatedFromNavet], [TemporaryDistrubtionAddress1], [TemporaryDistrubtionAddress2], [TemporaryDistrubtionAddress3], [TemporaryDistrubtionCountry], [Password], [VisibilityLevel],[SeamanIdentity], [LastChangedBy], [LastChangedDate], LogAction) 
SELECT [PersonalIdentityNumber], [ProtectedIdentity], [ReferedCivicRegistrationNumber], [UnregistrationReason], [UnregistrationDate], [MessageComputerComputer], [GivenNameNumber], [FirstName], [MiddleName], [LastName], [NotifyName], [NationalRegistrationDate], [NationalRegistrationCountyCode], [NationalRegistrationMunicipalityCode], [NationalRegistrationCoAddress], [NationalRegistrationDistributionAddress1], [NationalRegistrationDistributionAddress2], [NationalRegistrationPostCode], [NationalRegistrationCity], [NationalRegistrationNotifyDistributionAddress], [NationalRegistrationNotifyPostCode], [NationalRegistrationNotifyCity], [ForeignDistrubtionAddress1], [ForeignDistrubtionAddress2], [ForeignDistrubtionAddress3], [ForeignDistrubtionCountry], [ForeignDate], [BirthCountyCode], [BirthParish], [ForeignBirthCity], [CitizenshipCode], [CitizenshipDate], [Email], [Telephone], [Mobiletelephone], [Gender], [NotNewsPaper], [Note], [StatusCode], [NationalRegistrationCode], [RegistrationDate], [LastUpdatedFromNavet], [TemporaryDistrubtionAddress1], [TemporaryDistrubtionAddress2], [TemporaryDistrubtionAddress3], [TemporaryDistrubtionCountry], [Password], [VisibilityLevel], [SeamanIdentity], [LastChangedBy], [LastChangedDate], 'INSERT' FROM INSERTED 

Как я могу убедиться, что он не нарушает ограничение первичного ключа?

UPDATE 2

USE [Bums] 
GO 
/****** Object: Trigger [dbo].[trSeamen_LogU] Script Date: 05/16/2016 12:53:46 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[trSeamen_LogU] ON [dbo].[Seamen] AFTER UPDATE AS 
INSERT INTO [logSeamen] ([PersonalIdentityNumber], [ProtectedIdentity], [ReferedCivicRegistrationNumber], [UnregistrationReason], [UnregistrationDate], [MessageComputerComputer], [GivenNameNumber], [FirstName], [MiddleName], [LastName], [NotifyName], [NationalRegistrationDate], [NationalRegistrationCountyCode], [NationalRegistrationMunicipalityCode], [NationalRegistrationCoAddress], [NationalRegistrationDistributionAddress1], [NationalRegistrationDistributionAddress2], [NationalRegistrationPostCode], [NationalRegistrationCity], [NationalRegistrationNotifyDistributionAddress], [NationalRegistrationNotifyPostCode], [NationalRegistrationNotifyCity], [ForeignDistrubtionAddress1], [ForeignDistrubtionAddress2], [ForeignDistrubtionAddress3], [ForeignDistrubtionCountry], [ForeignDate], [BirthCountyCode], [BirthParish], [ForeignBirthCity], [CitizenshipCode], [CitizenshipDate], [Email], [Telephone], [Mobiletelephone], [Gender], [NotNewsPaper], [Note], [StatusCode], [NationalRegistrationCode], [RegistrationDate], [LastUpdatedFromNavet], [TemporaryDistrubtionAddress1], [TemporaryDistrubtionAddress2], [TemporaryDistrubtionAddress3], [TemporaryDistrubtionCountry], [Password], [VisibilityLevel], [SeamanIdentity],[LastChangedBy], [LastChangedDate], LogAction) 
SELECT [PersonalIdentityNumber], [ProtectedIdentity], [ReferedCivicRegistrationNumber], [UnregistrationReason], [UnregistrationDate], [MessageComputerComputer], [GivenNameNumber], [FirstName], [MiddleName], [LastName], [NotifyName], [NationalRegistrationDate], [NationalRegistrationCountyCode], [NationalRegistrationMunicipalityCode], [NationalRegistrationCoAddress], [NationalRegistrationDistributionAddress1], [NationalRegistrationDistributionAddress2], [NationalRegistrationPostCode], [NationalRegistrationCity], [NationalRegistrationNotifyDistributionAddress], [NationalRegistrationNotifyPostCode], [NationalRegistrationNotifyCity], [ForeignDistrubtionAddress1], [ForeignDistrubtionAddress2], [ForeignDistrubtionAddress3], [ForeignDistrubtionCountry], [ForeignDate], [BirthCountyCode], [BirthParish], [ForeignBirthCity], [CitizenshipCode], [CitizenshipDate], [Email], [Telephone], [Mobiletelephone], [Gender], [NotNewsPaper], [Note], [StatusCode], [NationalRegistrationCode], [RegistrationDate], [LastUpdatedFromNavet], [TemporaryDistrubtionAddress1], [TemporaryDistrubtionAddress2], [TemporaryDistrubtionAddress3], [TemporaryDistrubtionCountry], [Password], [VisibilityLevel], [SeamanIdentity],[LastChangedBy], [LastChangedDate], 'UPDATE' FROM INSERTED 
+0

Ваш личный идентификационный номер не автоинкремент? – BugFinder

+0

@BugFinder Нет, это не так. Однако. Код работает, не включая конкретные персональные имена, которые кажутся странными .. –

+0

У вас также есть ошибка там, когда соединение не удается, оно провалится и продолжит выполнение остальной части кода. – t0mm13b

ответ

1

Ваш триггер вводит ряд значений из вставленной таблицы, и вы говорите, что PersonalIdentityNumber является первичным ключом в LogSeamen. Тогда очевидно, что это было бы нарушено при каждом обновлении, потому что оно уже вставлено в первую операцию вставки. Удалите PK_LogSeamen или еще лучше создайте другой автоматически созданный столбец для ПК.

+0

Вы правы, это то, о чем я тоже думал. Однако задача LogSeamen заключается в регистрации изменений (обновлений), которые произошли с каждой строкой. Поэтому один и тот же элемент PersonalIdentityNumber можно вставлять несколько раз. Если я ищу конкретный элемент PersonalIdentityNumber в LogSeamen, я получаю несколько строк с тем же именем PersonalIdentityNumbers, потому что, как я уже сказал, он регистрирует произошедшие изменения, поэтому один и тот же идентификатор PersonalIdenityNumber можно вставлять несколько раз в LogSeamen. –

+0

Я исправил его. Проблема заключалась в том, что иногда ничего не обновлялось, поэтому предполагалось, что это точно так же. Я включил столбец «LastChanged», чтобы он всегда обновлялся до текущего времени, поэтому теперь он будет обновляться независимо от того, что. Спасибо, что помогли. –

1

RE:

Violation of Primary key constraint 'PK_logSeamen'. Cannot insert duplicate key in object 'dbo.logSeamen'. The statement has been terminated.

Похоже, у вас есть триггер обновления на матросам таблице. Проверьте, что делает ваш триггер, и при необходимости исправьте.

+0

Да, у меня есть триггер, пожалуйста, посмотрите мое обновление. –

+0

У вас есть триггер только для вставки или для обновления? – Alex

0

Обновления могут происходить много раз на столе. Ваша таблица logSeamen предназначена для отслеживания изменений, и всегда возможно, что обновляемая строка уже была обновлена ​​в прошлом. Вы не можете пометить PersonalIdentityNumber (или любой столбец из таблицы Seamen) в качестве основного ключа в таблице logSeamen.

Чтобы устранить эту проблему,

Удалить ограничение первичного ключа из PersonalIdentityNumber столбца в таблице logSeamen, так что вы можете вставлять одинаковые PersonalIdentityNumber несколько раз.

При необходимости добавьте новый столбец (скажем logSeamenId) в качестве первичного ключа с INDENTITY(1,1), который автоматически сгенерирует число для этой строки.

+0

Я исправил его. Проблема заключалась в том, что иногда ничего не обновлялось, поэтому предполагалось, что это точно так же. Я включил столбец «LastChanged», чтобы он всегда обновлялся до текущего времени, поэтому теперь он будет обновляться независимо от того, что. Спасибо, что помогли. –

Смежные вопросы