[c#] La conversion d'un type de données datetime2 en un type de données datetime entraîne une valeur hors plage



Answers

Cela peut se produire si vous n'attribuez pas de valeur à un champ DateTime lorsque le champ n'accepte pas les valeurs NULL.

Cela l'a arrangé pour moi!

Question

J'ai un datatable avec 5 colonnes, où une ligne est remplie de données puis enregistrée dans la base de données via une transaction.

Lors de l'enregistrement, une erreur est renvoyée:

La conversion d'un type de données datetime2 en un type de données datetime a entraîné une valeur hors plage

Il implique, comme lu, que mon datatable a un type de DateTime2 et ma base de données un DateTime ; C'est faux.

La colonne date est définie sur un DateTime comme ceci:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Question

Cela peut-il être résolu dans le code ou faut-il changer quelque chose au niveau de la base de données?




Parfois, cela fonctionne bien sur les machines de développement et non sur les serveurs. Dans mon cas, je devais mettre:

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

Dans le fichier web.config.

Le fuseau horaire de la machine (Serveur) était correct (dans les paramètres régionaux du central) mais pas l'application Web. Ce réglage a été fait et cela a bien fonctionné à nouveau.

Bien sûr, toutes les dates avaient une valeur.

:RÉ




Je suis tombé dessus et ajouté ce qui suit à ma propriété datetime:

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



Entity Framework 4 fonctionne avec le type de données datetime2. Dans db, le champ correspondant doit être datetime2 pour SQL Server 2008.

Pour réaliser la solution il y a deux façons.

  1. Pour utiliser le type de données datetime dans Entity Framwork 4, vous devez remplacer le paramètre ProviderManifestToken du fichier edmx par "2005".
  2. Si vous définissez le champ correspondant comme Allow Null (il le convertit en NULLABLE), EF utilise automatiquement les objets de date en tant que datetime.



J'ai trouvé cet article en essayant de comprendre pourquoi j'ai continué à obtenir l'erreur suivante qui est expliquée par les autres réponses.

La conversion d'un type de données datetime2 en un type de données datetime a entraîné une valeur hors plage.

Utilisez un objet DateTime nullable.
DateTime public? PurchaseDate {get; ensemble; }

Si vous utilisez la structure d'entité Définissez la propriété nullable dans le fichier edmx sur True




Dans ma base de données SQL Server 2008, j'avais une colonne DateTime marquée comme non nullable, mais avec une fonction GetDate() comme valeur par défaut. Lors de l'insertion d'un nouvel objet en utilisant EF4, j'ai reçu cette erreur car je ne transmettais pas explicitement une propriété DateTime sur mon objet. Je m'attendais à ce que la fonction SQL gère la date pour moi mais ce n'était pas le cas. Ma solution était d'envoyer la valeur de la date du code au lieu de compter sur la base de données pour le générer.

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



Création d'une classe de base basée sur l'implémentation @ sky-dev. Cela peut donc être facilement appliqué à plusieurs contextes et entités.

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;
                    }
                }
            }
        }
    }
}

Usage:

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.)
 }



Celui-ci me rendait fou. Je voulais éviter d'utiliser une date nulle ( DateTime? ). Je n'avais pas la possibilité d'utiliser le type datetime2 de SQL Server 2008

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

J'ai finalement opté pour ce qui suit:

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;
                    }
                }
            }
        }
    }
}



Related