Domanda

Ok, sto usando SQL Server Express 2008 e .Net 3.5 (c #)

Ho un paio di campi datetime nel database e sto provando a fare una modifica a una riga (usando Linq-to-Sql) ricevo l'errore " Riga non trovata o modificata. "

Ho impiegato un po 'di tempo a ottenere l'SQL generato e sembra che il problema sia causato dai millisecondi collegati al datetime.

SQL generato che non funziona,

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

se lo modifico da solo in modo che funzioni,

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

Quali sono le mie opzioni per risolverlo?

Solo per aggiungere questo è il mio codice di modifica,

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();
È stato utile?

Soluzione

Vedi questo link,

System.Data.Linq.ChangeConflictException: Riga non trovata o modificato

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

UpdateCheck to never per quella colonna   il tuo file DBML

Questo ha risolto il mio problema ma sembra un po 'un hack.

Lascio questo aperto per vedere cosa pensano gli altri.

Altri suggerimenti

Controlla questo post , spiega che dobbiamo tenere d'occhio le colonne DateTime, verificare la presenza di diversi tipi di dati tra il dbml e il database e, infine, spiega l'approccio ottimistico della concorrenza 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)

Poiché l'unica differenza nel tuo esempio è millisecondi, allora userei SQL Profiler per determinare se l'originale Select restituisce millisecondi. Quindi vedi se riesci a risolvere quel problema. Sembra che i dati della riga contengano millisecondi ma la tua selezione non li sta restituendo.

Dopo averlo fatto e avere ancora il problema, possiamo vedere quale sarà il prossimo passo.

Fondamentalmente lo schema MSSQL e il contesto dati Linq non funzionano bene insieme nella configurazione menzionata. Puoi modificare lo schema DB o il contesto dati.

Modifica il tipo di dati MSSQL

Stiamo utilizzando smalldatetime anziché datetime quando un precisione di 1 minuto può essere utilizzata.

Cambia il contesto dei dati LINQ in SQL

Se hai bisogno di una precisione maggiore di 1 minuto, guarda la risposta di LiamB a imposta UpdateCheck su Never per la colonna in il contesto dei dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top