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





the out-of-range (15)


Parfois, EF ne sait pas qu'il s'agit d'une colonne calculée ou d'un déclencheur . Par conception, ces opérations définiront une valeur en dehors de EF après une insertion.

La solution consiste à spécifier Computed dans edmx de EF pour cette colonne dans la propriété StoreGeneratedPattern .

Pour moi, c'était quand la colonne avait un déclencheur qui inséré la date et l'heure actuelle, voir ci-dessous dans la troisième section.

Étapes à résoudre

Dans Visual Studio, ouvrez la page Model Browser puis Model puis Entity Types -> puis

  1. Sélectionnez l'entité et la propriété de date et d'heure
  2. Sélectionnez StoreGeneratedPattern
  3. Définir sur Computed

Pour cette situation, les autres réponses sont des solutions de contournement, dans le but de la colonne est d'avoir une heure / date spécifiée lors de la création de l'enregistrement, et c'est le travail de SQL pour exécuter un déclencheur pour ajouter l'heure correcte. Comme ce déclencheur SQL:

DEFAULT (GETDATE()) FOR [DateCreated] .

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?




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.



pour moi c'était parce que le datetime était ..

01/01/0001 00:00:00

dans ce cas, vous voulez assigner une valeur nulle à votre objet EF DateTime ... en utilisant mon code FirstYearRegistered comme exemple

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



Quel genre de dates avez-vous dans la colonne?

Est-ce que chacun d'entre eux se situe dans la gamme du type?

En passant, la façon correcte d'obtenir un objet Type pour le constructeur DataColumn est le mot-clé typeof , qui est plus rapide de plusieurs ordres de grandeur.

Par conséquent, pour créer la colonne, vous devez écrire

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



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



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



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



Si nous ne transmettons pas un champ d'heure de date à date, la date par défaut {1/1/0001 12:00:00 AM} sera transmise.

Mais cette date n'est pas compatible avec le travail de trame d'entité. Ainsi, la conversion d'un type de données datetime2 en un type de données datetime entraîne une valeur hors plage.

Juste default DateTime.now dans le champ de date si vous ne transmettez aucune date.

movie.DateAdded = System.DateTime.Now



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#



vous aurez une colonne de date qui a été définie à lesathan la valeur min de datetime autorisé comme 1/1/1001.

Pour résoudre ce problème, vous pouvez définir la valeur datetime correcte pour votre propriété adn et définir une autre propriété magique comme IsSpecified = true.




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!




Dans mon cas, nous avons lancé une date sur une date et nous avons eu cette erreur. Ce qui se passe est que Date a un minimum "orienté programmeur" au 01/01/0001, alors que Datetime est bloqué à 1753

Combinez cela avec une erreur de collecte de données de notre part, et vous obtenez votre exception!




La méthode actuelle consiste à utiliser la commande "Ajouter une référence de service". Si vous spécifiez " TestUploaderWebService " comme nom de référence de service, cela générera le type TestUploaderWebService.Service1 . Cette classe aura une méthode nommée GetFileListOnWebServer , qui retournera un tableau de chaînes (vous pouvez changer cela pour en faire une liste de chaînes si vous le souhaitez). Vous l'utiliseriez comme ceci:

string[] files = null;
TestUploaderWebService.Service1 proxy = null;
bool success = false;
try
{
    proxy = new TestUploaderWebService.Service1();
    files = proxy.GetFileListOnWebServer();
    proxy.Close();
    success = true;
}
finally
{
    if (!success)
    {
        proxy.Abort();
    }
}

PS Dites à votre instructeur de regarder " Microsoft: Les services Web ASMX sont une" technologie héritée " ", et demandez pourquoi il enseigne une technologie obsolète.





c# sql-server entity-framework datetime orm