Tengo una tabla de datos con 5 columnas, donde una fila se llena con datos y luego se guarda en la base de datos a través de una transacción.
Al guardar, se devuelve un error:
La conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango
Implica, como se lee, que mi tabla de datos tiene un tipo de DateTime2
y mi base de datos a DateTime
; eso está mal.
La columna de fecha se establece de DateTime
esta manera:
new DataColumn("myDate", Type.GetType("System.DateTime"))
Pregunta
¿Se puede resolver esto en código o hay que cambiar algo a nivel de base de datos?
fuente
Esto puede suceder si no asigna un valor a un campo DateTime cuando el campo no acepta valores NULL .
¡Eso me lo arregló!
fuente
Tanto el
DATETIME
y elDATETIME2
mapaSystem.DateTime
en .NET - realmente no puede hacer una "conversión", ya que es realmente el mismo tipo .NET.Consulte la página de documentos de MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Hay dos valores diferentes para el "
SqlDbType
" para estos dos: ¿puede especificarlos en suDataColumn
definición?PERO: en SQL Server, el intervalo de fechas admitido es bastante diferente.
DATETIME
admite 1753/1/1 hasta "eternity" (9999/12/31), mientras queDATETIME2
admite 0001/1/1 hasta la eternidad.Entonces, lo que realmente necesita hacer es verificar el año de la fecha; si es antes de 1753, debe cambiarlo a algo DESPUÉS de 1753 para que el
DATETIME
columna en SQL Server lo maneje.Bagazo
fuente
DtInit = new System.DateTime(1492, 10, 12),
fallaEn mi base de datos SQL Server 2008, tenía una
DateTime
columna marcada como no anulable, pero con unaGetDate()
función como valor predeterminado. Al insertar un nuevo objeto usando EF4, recibí este error porque no estaba pasando explícitamente una propiedad DateTime en mi objeto. Esperaba que la función SQL manejara la fecha por mí, pero no lo hizo. Mi solución fue enviar el valor de la fecha desde el código en lugar de confiar en la base de datos para generarlo.fuente
Nullable<DateTime>
, y en el código puedo dejar esto realmente nulo (en lugar de 01/01/0000). Me sorprendió gratamente ver que EF to SQL sabía ignorar este valor nulo en INSERT y usar la fecha del servidor (GetDate()
) ... Para nosotros, esto era incluso preferible ya que necesitábamos una mayor coherencia en el servidor, sin preocuparnos por las diferencias de reloj entre el servidor web y el del servidor sql.para mí fue porque la fecha y hora era ...
en este caso, desea asignarle un objeto EF DateTime nulo ... utilizando mi código FirstYearRegistered como ejemplo
fuente
Este me estaba volviendo loco. Quería evitar el uso de una fecha y hora anulables (
DateTime?
). Tampoco tenía la opción de usar eldatetime2
tipo de SQL Server 2008Finalmente opté por lo siguiente:
fuente
[Column(TypeName = "datetime2")]
?A veces, EF no sabe que se trata de una columna calculada o un disparador . Por diseño, esas operaciones establecerán un valor fuera de EF después de una inserción.
La solución es especificar
Computed
en EFedmx
para esa columna en laStoreGeneratedPattern
propiedad.Para mí fue cuando la columna tenía un disparador que insertaba la fecha y hora actuales, ver más abajo en la tercera sección.
Pasos para resolver
En Visual Studio abra la
Model Browser
página,Model
luegoEntity Types
-> luegoStoreGeneratedPattern
Computed
Para esta situación, otras respuestas son soluciones alternativas, para el propósito de la columna es tener una hora / fecha especificada cuando se creó el registro, y ese es el trabajo de SQL para ejecutar un disparador para agregar la hora correcta. Como este disparador SQL:
DEFAULT (GETDATE()) FOR [DateCreated]
.fuente
GETDATE()
lo que literalmente hice en ese momento. Pero hubo un comentario reciente que uno debe usarSYSDATETIME()
para cualquier operación DateTime2 que creo que es cierto.Me encontré con esto y agregué lo siguiente a mi propiedad datetime:
fuente
using System.ComponentModel.DataAnnotations.Schema;
se requiereSi no pasamos un campo de fecha hora a fecha, se pasará la fecha predeterminada {1/1/0001 12:00:00 AM}.
Pero esta fecha no es compatible con el marco de la entidad, por lo que arrojará la conversión de un tipo de datos datetime2 a un tipo de datos datetime que resultó en un valor fuera de rango
Solo
default DateTime.now
al campo de fecha si no está pasando ninguna fecha.fuente
Lo más fácil sería cambiar su base de datos para usar datetime2 en lugar de datetime. La compatibilidad funciona bien y no obtendrá sus errores.
Todavía querrás hacer un montón de pruebas ...
El error probablemente se deba a que está tratando de establecer una fecha para el año 0 o algo así, pero todo depende de dónde tenga el control para cambiar las cosas.
fuente
Encontré esta publicación tratando de averiguar por qué seguía recibiendo el siguiente error, que se explica en las otras respuestas.
La conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango.
Use un objeto DateTime anulable.
fecha y hora pública? PurchaseDate {get; conjunto; }
Si está utilizando el marco de la entidad Establezca la propiedad anulable en el archivo edmx en True
fuente
Como ya ha señalado andyuk , esto puede suceder cuando se asigna un valor NULL a un campo DateTime no anulable . ¿Considera cambiar DateTime a DateTime? o Nullable < DateTime >. Tenga en cuenta que, en caso de que esté utilizando una propiedad de dependencia , también debe asegurarse de que el tipo de su propiedad de dependencia también sea un tipo DateTime anulable.
A continuación se muestra un ejemplo de la vida real de un DateTime a DateTime incompleto . ajuste de tipo que aumenta el comportamiento extraño
fuente
Entity Framework 4 funciona con el tipo de datos datetime2, por lo que en db el campo correspondiente debe ser datetime2 para SQL Server 2008.
Para lograr la solución hay dos formas.
fuente
Creó una clase base basada en la implementación @ sky-dev. Por lo tanto, esto se puede aplicar fácilmente a múltiples contextos y entidades.
Uso:
fuente
Agregue el atributo mencionado a continuación en la propiedad en su clase de modelo.
Inicialmente olvidé agregar este atributo. Entonces, en mi base de datos, la restricción se creó como
y agregué este atributo y actualicé mi base de datos, luego se cambió a
fuente
En mi caso, estábamos enviando una fecha a una fecha y hora y obtuvimos este error. Lo que sucede es que Date tiene un mínimo "más orientado a los programadores" del 01/01/0001, mientras que Datetime está atascado en 1753
Combine eso con un error de recopilación de datos de nuestra parte, ¡y obtendrá su excepción!
fuente
A veces funciona bien en máquinas de desarrollo y no en servidores. En mi caso tuve que poner:
En el archivo web.config.
La zona horaria en la máquina (Servidor) era correcta (a la configuración regional de CO) pero la aplicación web no. Esta configuración se realizó y funcionó bien nuevamente.
Por supuesto, todas las fechas tenían valor.
:RE
fuente
Agregar este código a una clase en ASP.NET funcionó para mí:
fuente
Soy consciente de este problema y todos ustedes también deberían estarlo:
https://en.wikipedia.org/wiki/Year_2038_problem
En SQL, se creó un nuevo tipo de campo para evitar este problema (datetime2).
Este tipo de campo 'Fecha' tiene los mismos valores de rango que una clase DateTime .Net. Resolverá todos sus problemas, por lo que creo que la mejor manera de resolverlo es cambiar el tipo de columna de su base de datos (no afectará los datos de su tabla).
fuente
Consulte los dos siguientes: 1) Este campo no tiene valor NULL. Por ejemplo:
Reemplazar a:
2) Nueva la base de datos nuevamente. Por ejemplo:
fuente
Problema con el atributo de fecha y hora heredado
Este mensaje de error a menudo se muestra cuando un campo de fecha no anulable tiene un valor nulo en el momento de inserción / actualización. Una causa puede ser la herencia.
Si su fecha se hereda de una clase base y no realiza una asignación, EF no leerá su valor.
Para más información: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- elección-pautas-estrategia
fuente
Vi este error cuando quería editar una página usando ASP.Net MVC. ¡No tuve ningún problema al crear pero actualizar la base de datos hizo que mi propiedad DateCreated fuera de rango!
Cuando no desee que su
DateTime
propiedad sea anulable y no desee verificar si su valor está en el rango de fecha y hora sql (¡y@Html.HiddenFor
no ayuda!), Simplemente agregue unstatic DateTime
campo dentro de la clase relacionada (Controlador) y dele el valor cuando GET está funcionando, luego úselo cuando POST esté haciendo su trabajo:fuente
Me encontré con este problema en un proyecto de aplicación de consola simple y mi solución rápida es convertir cualquier fecha datetime2 posible en una fecha y hora anulable ejecutando este método:
Este ciertamente no es un método completamente completo, ¡pero funcionó para mis necesidades y quizás ayude a otros!
fuente
Verifique el formato de solicitud en DB. por ejemplo, mi base de datos tiene valor predeterminado o enlace
(((1)/(1))/(1900))
fuente
tendrá una columna de fecha que se configuró para lesathan el valor mínimo del tiempo de transmisión permitido como 1/1/1001.
Para superar este problema, puede establecer el valor de fecha y hora adecuado para su propiedad y también establecer otra propiedad mágica como IsSpecified = true.
fuente