¿Linq-To-Sql problema con datetime?
-
06-07-2019 - |
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();
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.