He estado usando este fragmento de código que escribí y funciona de la manera más confusa. Deseo insertar una fila en la base de datos que incluye dos columnas de DateTime:
myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now
Y, sin embargo, cuando actualizo la base de datos, recibo este error:
Desbordamiento de SqlDateTime. Debe ser entre el 1/1/1753 12:00:00 AM y el 31/12/9999 11:59:59 PM.
Incluso intenté copiar un valor insertado de la base de datos y codificarlo en el objeto que se actualiza:
// I copied this value from the DB
myrow.ApprovalDate = Convert.ToDateTime("2008-12-24 00:00:00.000");
Aún el mismo error, la parte extraña es que el truco anterior funcionó para la primera inserción en la base de datos, pero falló a partir de ahí. ¿Alguna idea de qué está pasando?
asp.net
linq-to-sql
sql-server-2008
Dibujó Noakes
fuente
fuente
Respuestas:
A
DateTime
en C # es un tipo de valor, no un tipo de referencia y, por lo tanto, no puede ser nulo. Sin embargo, puede ser la constanteDateTime.MinValue
que está fuera del rango delDATETIME
tipo de datos de Sql Servers .Se garantiza que los tipos de valor siempre tendrán un valor (predeterminado) (de cero) sin necesidad de establecer siempre explícitamente (en este caso, DateTime.MinValue).
La conclusión es que probablemente tenga un valor DateTime no establecido que está intentando pasar a la base de datos.
MSDN: DateTime.MinValue
Respecto al servidor SQL
MSDN: Sql Server DateTime y SmallDateTime
Por último, si se encuentra pasando un C #
DateTime
como una cadena a sql, debe formatearlo de la siguiente manera para mantener la máxima precisión y evitar que el servidor SQL arroje un error similar.Actualización (8 años después)
Considere usar el
DateTime2
tipo de datos sql que se alinea mejor con el .netDateTime
con rango de fecha0001-01-01 through 9999-12-31
y rango de tiempo00:00:00 through 23:59:59.9999999
MSDN datetime2 (Transact-SQL)
fuente
DateTime
no ser anulable en C #!Encuentro que usar lo siguiente funciona bastante bien para las fechas mínimas / máximas de SQL después de muchos errores relacionados con la base de datos:
fuente
DateTime.MaxValue
ySqlDateTime.MaxValue.Value
. SQL Server 2014 y SQL Server 2016 (no marcaron otros) aceptanDateTime.MaxValue
cuál, lo suficientemente curioso, es mayor queSqlDateTime.MaxValue.Value
.Tenga cuidado al comparar un .Net DateTime con SqlDateTime.MinValue o MaxValue. Por ejemplo, lo siguiente generará una excepción:
DateTime dte = new DateTime(1000, 1, 1); if (dte >= SqlDateTime.MinValue) //do something
La razón es que MinValue devuelve un SqlDateTime, no un DateTime. Entonces .Net intenta convertir dte a SqlDateTime para comparar y, debido a que está fuera del rango aceptable de SqlDateTime, lanza la excepción.
Una solución a esto es comparar su DateTime con SqlDateTime.MinValue. Valor .
fuente
SqlDateTime.MinValue.Value
oSqlDateTime.MaxValue.Value
ambos son de tipoDateTime
. No sé cuándo se introdujeron. Sin embargo, tenga en cuenta que hay algunas diferencias entreDateTime.MaxValue
ySqlDateTime.MaxValue.Value
. SQL Server 2014 y SQL Server 2016 (no marcaron otros) aceptanDateTime.MaxValue
cuál - lo suficientemente divertido es más grande queSqlDateTime.MaxValue.Value
.El código que tiene para las dos columnas parece correcto. Busque cualquier otra columna de fecha y hora en esa clase de mapeo. Además, habilite el registro en el contexto de datos para ver la consulta y los parámetros.
DateTime se inicializa en el 0 de c #, que es 0001-01-01. Esto es transmitido por linqtosql a la base de datos a través del literal de cadena sql: '0001-01-01'. Sql no puede analizar una fecha y hora T-Sql a partir de esta fecha.
Hay un par de formas de lidiar con esto:
fuente
Este error se produce si intenta establecer una variable de tipo DateTime en nulo . Declare la variable como anulable, es decir, DateTime? . Esto solucionará el problema.
fuente
A veces, para escribir menos código, se usa para que el servidor SQL establezca campos como fecha, hora e ID en la inserción estableciendo el valor predeterminado para los campos en
GETDATE()
oNEWID()
.En tales casos, la propiedad de valor generado automáticamente de esos campos en clases de entidad debe establecerse en verdadero.
De esta manera no es necesario establecer valores en el código (¡¡¡evitando el consumo de energía !!!) y nunca ver esa excepción.
fuente
Usar método de extensión
fuente
Eso generalmente significa que se publica un nulo en la consulta en lugar del valor deseado, puede intentar ejecutar el Analizador de SQL para ver exactamente qué se pasa a SQL Server desde linq.
fuente
Por lo general, este tipo de error se produce cuando realiza la conversión o el análisis de DateTime. Verifique la configuración del calendario en el servidor donde está alojada la aplicación, principalmente la zona horaria y el formato de fecha corta, y asegúrese de que esté configurado en la zona horaria correcta para la ubicación. Espero que esto resuelva el problema.
fuente
Veo lo mismo. El error no ocurre al insertar una fila sino en una actualización. la tabla a la que me refiero tiene dos columnas DateTime, ninguna de las cuales es anulable.
He bajado el escenario para obtener la fila y guardarla inmediatamente (sin cambios de datos). El get funciona bien pero la actualización falla.
Estamos usando NHibernate 3.3.1.4000
fuente
Si está utilizando NHibernate, compruebe que las propiedades de DateTime adecuadas que admiten nulos estén configuradas como nulos en las asignaciones.
fuente
Si pones Datetime anulable como DateTime? en su modelo no lanza una excepción. Resolví el problema así en mi caso
fuente
En mi caso, este error se generó porque la columna de fecha de la tabla no es nula
Como a continuación:
Create Table #TempTable( ... ApprovalDate datatime not null. ...)
Para evitar este error, simplemente hágalo nulo
Create Table #TempTable( ... ApprovalDate datatime null. ...)
fuente
DateTime.MinValue y DateTime.MaxValue
fuente