visual variable usar tipo inicializar fecha declarar dato c# sql-server entity-framework datetime orm

c# - variable - La conversión de un tipo de datos datetime2 a un tipo de datos datetime da como resultado un valor fuera de rango



usar datetime c# (17)

¿Qué tipo de fechas tienes en la columna?

¿Todos encajan dentro del rango del tipo?

Además, la forma correcta de obtener un objeto Type para el constructor DataColumn es la typeof clave typeof , que es órdenes de magnitud más rápido.

Por lo tanto, para crear la columna, debes escribir

new DataColumn("myDate", typeof(DateTime))

Tengo un datatable con 5 columnas, donde una fila se llena con datos y luego se guarda en la base de datos mediante una transacción

Mientras se guarda, se devuelve un error:

La conversión de un tipo de datos datetime2 a un tipo de datos datetime resultó en un valor fuera de rango

Implica, como leído, que mi datatable tiene un tipo de DateTime2 y mi base de datos un DateTime ; eso está mal.

La columna de fecha se establece en un DateTime como este:

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?


A veces funciona bien en máquinas de desarrollo y no en servidores. En mi caso tuve que poner:

<globalization uiCulture="es" culture="es-CO" />

En el archivo web.config.

La zona horaria en la máquina (Servidor) era correcta (para la configuración regional CO) pero la aplicación web no. Este ajuste hecho y funcionó bien de nuevo.

Por supuesto, todas las fechas tenían valor.

:RE


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 edmx de EF para esa columna en la propiedad StoreGeneratedPattern .

Para mí, fue cuando la columna tenía un disparador que insertaba la fecha y la hora actuales, vea más abajo en la tercera sección.

Pasos para resolver

En Visual Studio, abra la página Model Browser , luego Model luego Entity Types -> then

  1. Seleccione la entidad y la fecha hora propiedad
  2. Seleccione StoreGeneratedPattern
  3. Establecer en Computed

Para esta situación, otras respuestas son soluciones alternativas, para el propósito de la columna es tener una fecha / hora 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 de SQL:

DEFAULT (GETDATE()) FOR [DateCreated] .


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 propiedad de su dependencia también sea un tipo de fecha y hora que pueda contener nulos.

A continuación se muestra un ejemplo de la vida real de un DateTime incompleto a DateTime? Ajuste de tipo que eleva el comportamiento impar.


Creé una clase base basada en la implementación de @ sky-dev. Por lo tanto, esto se puede aplicar fácilmente a múltiples contextos y entidades.

public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class { public BaseDbContext(string connectionString) : base(connectionString) { } public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries<TEntity>()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } }

Uso:

public class MyContext: BaseDbContext<MyEntities> { /// <summary> /// Initializes a new instance of the <see cref="MyContext"/> class. /// </summary> public MyContext() : base("name=MyConnectionString") { } /// <summary> /// Initializes a new instance of the <see cref="MyContext"/> class. /// </summary> /// <param name="connectionString">The connection string.</param> public MyContext(string connectionString) : base(connectionString) { } //DBcontext class body here (methods, overrides, etc.) }


En mi base de datos de SQL Server 2008, tenía una columna DateTime marcada como no anulable, pero con una función GetDate() como su valor predeterminado. Al insertar un nuevo objeto utilizando EF4, recibí este error porque no estaba pasando una propiedad DateTime en mi objeto explícitamente. Esperaba que la función SQL manejara la fecha por mí, pero no fue así. Mi solución fue enviar el valor de fecha desde el código en lugar de confiar en la base de datos para generarla.

obj.DateProperty = DateTime.now; // C#


En mi caso, estábamos lanzando una fecha a una fecha y tuvimos este error. Lo que sucede es que Date tiene un mínimo de "más orientado a programadores" de 01/01/0001, mientras que Datetime se atasca en 1753

¡Combine eso con un error de recopilación de datos de nuestra parte, y obtendrá su excepción!


Encontré esta publicación tratando de entender por qué seguí recibiendo el siguiente error, que se explica en las otras respuestas.

La conversión de un tipo de datos datetime2 en un tipo de datos datetime resultó en un valor fuera de rango.

Utilice un objeto DateTime que pueda ser nuleable.
¿Fecha pública? Fecha de compra {obtener; conjunto; }

Si está utilizando Entorno de entidad Establezca la propiedad anulable en el archivo edmx en Verdadero


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.

  1. Para usar el tipo de datos datetime en Entity Framwork 4, debe cambiar el ProviderManifestToken en el archivo edmx a "2005".
  2. Si configura el campo correspondiente como Permitir nulo (lo convierte a NULLABLE), entonces EF utiliza automáticamente los objetos de fecha como fecha y hora.

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 el tipo datetime2 SQL Server 2008

modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");

Finalmente opté por lo siguiente:

public class MyDb : DbContext { public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } }


Esto puede suceder si no asigna un valor a un campo DateTime cuando el campo no acepta valores NULL.

Eso lo arregló para mí!


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.

Aún querrás hacer un montón de pruebas ...

El error probablemente se deba a que está intentando establecer una fecha para el año 0 o algo así, pero todo depende de dónde tenga el control para cambiar las cosas.


Me encontré con esto y agregué lo siguiente a mi propiedad datetime:

movie.DateAdded = System.DateTime.Now


Para mí fue porque la fecha y hora era ...

01/01/0001 00:00:00

en este caso, desea asignar nulo a su EF DateTime Object ... usando mi código FirstYearRegistered como ejemplo

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]); if (FirstYearRegistered != DateTime.MinValue) { vehicleData.DateFirstReg = FirstYearRegistered; }


Si no pasamos un campo de fecha a hora, se pasará la fecha predeterminada {1/1/0001 12:00:00 AM}.

Pero esta fecha no es compatible con el trabajo de marco de entidad, por lo que lanzará la conversión de un tipo de datos datetime2 a un tipo de datos datetime que resultó en un valor fuera de rango

Simplemente default DateTime.now al campo de fecha si no pasa ninguna fecha.

[Column(TypeName = "datetime2")] public DateTime? NullableDateTimePropUtc { get; set; }


Tanto el DATETIME como el DATETIME2 asignan a System.DateTime en .NET: realmente no se puede hacer una "conversión", ya que en realidad es el mismo tipo de .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 su definición de DataColumn ?

PERO: en SQL Server, el intervalo de fechas admitido es bastante diferente.

DATETIME admite 1753/1/1 hasta la "eternidad" (9999/12/31), mientras que DATETIME2 admite 0001/1/1 hasta la eternidad.

Entonces, lo que realmente debe hacer es verificar el año de la fecha; si es anterior a 1753, debe cambiarlo a algo DESPUÉS de 1753 para que la columna DATETIME en SQL Server lo maneje.

Bagazo


Tendrá una columna de fecha que se configuró de forma que el valor mínimo del tiempo de lectura permitido sea 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.