Frage

Ok, ich bin mit SQL Server Express 2008 und .NET 3.5 (c #)

Ich habe ein paar von Datetime-Feldern in der Datenbank und ich versuche, bearbeitet, um eine Reihe zu machen (mit Linq-to-Sql) ich die Fehlermeldung „Zeile nicht gefunden oder geändert werden.“

Ich habe einige Zeit bekommen die generierten SQL ausgegeben, und es scheint, dass das Problem durch die Millisekunden an den Datetime angebracht verursacht wird.

generiert SQL, das nicht funktioniert,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

, wenn ich es selbst ändern wie so funktioniert es,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45.390]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36.733]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27.747]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

Was sind meine Optionen auf eine Weise nahe, dies zu bekommen?

Just hinzufügen das ist mein Bearbeiten von Code,

var UserToEdit = this.GetUser(UserId);

UserToEdit.Forename = Fields["Forename"];
UserToEdit.Surname = Fields["Surname"];
UserToEdit.DateOfBirth = Convert.ToDateTime(Fields["DateOfBirth"]);
UserToEdit.DisplayName = Fields["DisplayName"];
UserToEdit.TelephoneNumber = Fields["TelephoneNumber"];

_db.SubmitChanges();
War es hilfreich?

Lösung

Sehen Sie diesen Link,

System.Data.Linq.ChangeConflictException: Zeile nicht gefunden oder geändert

# High precision datetime fields are used. The solution is to set
     

Update nie für diese Spalte   Ihre DBML Datei

Das hat mein Problem gelöst, aber ein bisschen wie ein Hack fühlen.

Ich verlasse diese offen zu sehen, was andere denken.

Andere Tipps

Überprüfen Sie dieser Beitrag Es erklärt, dass wir ein Auge in Datetime-Spalten, überprüfen Sie für verschiedene Datentypen zwischen der dbml und Ihrer Datenbank und schließlich erklärt den LinQ Parallelität Ansatz halten müssen.

where foo.SignupDate >= signUpDate
  && foo.SignUpDate < signUpDate.AddSeconds(1)
  && foo.LastActivityDate >= lastActivityDate 
  && foo.LastActivityDate < lastActivityDate.AddSeconds(1)
  && foo.LastLoginDate >= lastActivityDate 
  && foo.LastLoginDate < lastActivityDate.AddSeconds(1)

Da der einzige Unterschied in Ihrem Beispiel ist Millisekunden dann würde ich SQL Profiler verwenden, wenn die ursprünglichen Select Rückkehr Millisekunden zu bestimmen. Dann sehen, wenn Sie dieses Problem beheben können. Es scheint, dass die Zeilendaten enthalten Millisekunden aber Sie wählen kehrt sie nicht.

Wenn Sie das tun, und Sie haben immer noch das Problem können wir sehen, was der nächste Schritt sein wird.

Grundsätzlich ist das MSSQL-Schema und Linq Datenkontext ist nicht gut zusammen in der genannten Konfiguration arbeitet. Sie können entweder DB-Schema oder Datenkontext ändern.

Ändern MSSQL Datentyp

Wir sind mit small anstelle von Datetime , wenn ein Genauigkeit von 1 Minute verwendet werden kann.

Ändern LINQ to SQL-Daten Kontext

Wenn Sie eine höhere Genauigkeit benötigen als 1 Minute, Blick auf LiamB eigene Antwort auf Update gesetzt niemals für die Spalte zu in der Datenkontext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top