2016-05-16 5 views
0

Ich habe den folgenden Code:Verletzung der Primärschlüssel-Integritätsfehler, wenn 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; 
    } 
} 
//} 

Der Fehler tritt hier:

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)); 

ich Fehler:

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

Muss ich muss die SqlCommand löschen?

Apperently hatte ich diesen Trigger

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 

Wie kann ich sicherstellen, dass es nicht die primäre Schlüsselbedingung verletzt?

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

ist Ihre persönlicheIdentitätsnummer nicht autoincrement? – BugFinder

+0

@BugFinder Nein, ist es nicht. Jedoch. Der Code funktioniert ohne spezifische PersonalIdentityNumbers, die seltsam erscheinen. –

+0

Sie haben auch einen Fehler drin, wenn die Verbindung fehlschlägt, wird es durchfallen und den Rest des Codes weiter ausführen. – t0mm13b

Antwort

1

Ihr Trigger fügt eine Reihe von Werten aus der eingefügten Tabelle ein und Sie sagen, dass PersonalIdentityNumber der Primärschlüssel in LogSeamen ist. Dann ist es offensichtlich, dass es bei jedem Update verletzt würde, da es dort beim ersten Einfügevorgang bereits eingefügt ist. Entfernen Sie PK_LogSeamen, oder besser noch eine andere automatisch generierte Spalte für das PK.

+0

Du hast recht, das habe ich auch zuerst gedacht. Der Zweck von LogSeamen besteht jedoch darin, die Änderungen (die Aktualisierungen) zu protokollieren, die mit jeder Zeile passiert sind. Daher kann dieselbe PersonalIdentityNumber mehrfach eingefügt werden. Wenn ich auf dem LogSeamen nach einer bestimmten PersonalIdentityNumber suche, erhalte ich mehrere Zeilen mit denselben PersonalIdentityNumbers, denn wie gesagt, protokolliert er die vorgenommenen Änderungen, daher kann dieselbe PersonalIdenityNumber mehrmals in LogSeamen eingefügt werden. –

+0

Ich habe es behoben. Das Problem war, dass es manchmal nichts zu aktualisieren gab, also nahm es an, dass es genau dasselbe war. Ich habe eine "LastChanged" -Spalte eingefügt, damit sie immer auf die aktuelle Zeit aktualisiert werden kann. Jetzt wird sie immer aktualisiert, egal was geschieht. Danke für deine Hilfe. –

1

RE:

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

Sieht aus wie Sie ein Update-Trigger auf Seemanns Tisch. Überprüfen Sie, was Ihr Auslöser tut, und korrigieren Sie ihn gegebenenfalls.

+0

Ja, ich hatte einen Auslöser, bitte sehen Sie mein Update. –

+0

Haben Sie einen Trigger nur zum Einfügen oder zum Aktualisieren? – Alex

0

Aktualisierungen können oft auf einem Tisch vorkommen. Ihre logSeamen Tabelle soll Änderungen nachverfolgen, und es ist immer möglich, dass die Zeile, die gerade aktualisiert wird, schon einmal in der Vergangenheit aktualisiert wurde. Sie können PersonalIdentityNumber (oder eine beliebige Spalte aus der Tabelle Seamen) nicht als Primärschlüssel in der Tabelle logSeamen markieren.

das Problem zu beheben,

entfernen Primärschlüsselbedingung von PersonalIdentityNumber Spalte in der Tabelle logSeamen, so dass Sie gleiche PersonalIdentityNumber mehrfach einfügen.

Fügen Sie optional eine neue Spalte (z. B. logSeamenId) als Primärschlüssel mit INDENTITY(1,1) hinzu, wodurch automatisch eine Nummer für diese Zeile generiert wird.

+0

Ich habe es behoben. Das Problem war, dass es manchmal nichts zu aktualisieren gab, also nahm es an, dass es genau dasselbe war. Ich habe eine "LastChanged" -Spalte eingefügt, damit sie immer auf die aktuelle Zeit aktualisiert werden kann. Jetzt wird sie immer aktualisiert, egal was geschieht. Danke für deine Hilfe. –

Verwandte Themen