Question

OK, j'utilise SQL Server Express 2008 et .Net 3.5 (c #)

J'ai quelques champs date / heure dans la base de données et j'essaie de modifier une ligne (à l'aide de Linq-to-Sql). Le message d'erreur "Ligne non trouvée ou modifiée" s'affiche. "

"

J'ai passé un certain temps à obtenir le code SQL généré et il semble que le problème soit causé par les millisecondes attachées à la date / heure.

SQL généré qui ne fonctionne pas,

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

si je le modifie moi-même comme ça marche,

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

Quelles sont mes options pour éviter cela?

Juste pour ajouter ceci est mon code d'édition,

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();
Était-ce utile?

La solution

Voir ce lien,

System.Data.Linq.ChangeConflictException: Ligne non trouvée ou changé

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

UpdateCheck pour jamais pour cette colonne   votre fichier DBML

Cela a résolu mon problème mais je me sens un peu comme un piratage.

Je laisse cette porte ouverte pour voir ce que les autres pensent.

Autres conseils

Vérifiez this post , Il explique que nous devons garder un œil sur les colonnes DateTime, rechercher différents types de données entre le dbml et votre base de données et, enfin, expliquer l’approche optimiste de concurrence de LinQ.

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)

Étant donné que la seule différence dans votre exemple est la milliseconde, j’utiliserais SQL Profiler pour déterminer si le rapport initial Select renvoie des millisecondes. Ensuite, voyez si vous pouvez résoudre ce problème. Il semble que les données de ligne contiennent des millisecondes, mais votre sélection ne les renvoie pas.

Une fois que vous avez fait cela et que le problème persiste, nous pouvons voir quelle sera l'étape suivante.

En gros, le schéma MSSQL et Linq Data Context ne fonctionnent pas bien ensemble dans la configuration mentionnée. Vous pouvez modifier le schéma de base de données ou le contexte de données.

Modifier le type de données MSSQL

Nous utilisons smalldatetime au lieu de datetime lorsqu'un une précision de 1 minute peut être utilisée.

Modifier le contexte de données LINQ en SQL

Si vous avez besoin d'une précision supérieure à 1 minute, consultez la réponse de LiamB à définir UpdateCheck sur Jamais pour la colonne située dans le contexte de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top