Pregunta

Ok, estoy usando SQL Server Express 2008 y .Net 3.5 (c #)

Tengo un par de campos de fecha y hora en la base de datos y estoy tratando de hacer una edición en una fila (usando Linq-to-Sql) Recibo el error " Fila no encontrada o modificada. "

He pasado algún tiempo obteniendo el SQL generado y parece que el problema se debe a los milisegundos adjuntos a la fecha y hora.

SQL generado que no funciona,

 @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 lo modifico yo mismo como funciona,

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

¿Cuáles son mis opciones para abordar esto?

Solo para agregar este es mi código de edición,

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();
¿Fue útil?

Solución

Ver este enlace,

System.Data.Linq.ChangeConflictException: No se encuentra la fila o cambiado

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

UpdateCheck nunca para esa columna   tu archivo DBML

Esto ha resuelto mi problema, pero me siento un poco como un hack.

Lo dejo abierto para ver qué piensan los demás.

Otros consejos

Verifique esta publicación , explica que debemos vigilar las columnas de DateTime, verificar los diferentes tipos de datos entre el dbml y su base de datos, y por último, explica el enfoque de concurrencia optimista 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)

Dado que la única diferencia en su ejemplo es en milisegundos, entonces usaría el Analizador de SQL para determinar si el Select original devuelve milisegundos. A continuación, ver si puede solucionar ese problema. Parece que los datos de la fila contienen milisegundos, pero su selección no los está devolviendo.

Después de hacer eso y aún tienes el problema, podemos ver cuál será el siguiente paso.

Básicamente, el esquema MSSQL y el contexto de datos Linq no funcionan bien juntos en la configuración mencionada. Puede cambiar el esquema de base de datos o el contexto de datos.

Cambiar el tipo de datos MSSQL

Estamos utilizando smalldatetime en lugar de datetime cuando aparece un se puede usar una precisión de 1 minuto .

Cambiar LINQ al contexto de datos SQL

Si necesita una precisión mayor a 1 minuto, consulte la respuesta de LiamB a configure UpdateCheck en Nunca para la columna en el contexto de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top