J'ai une table de données 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 donné lieu à une valeur hors plage
Cela implique, comme lu, que mon datatable a un type de DateTime2
et ma base de données a DateTime
; C'est faux.
La colonne de date est définie 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?
la source
Cela peut se produire si vous n'affectez pas de valeur à un champ DateTime lorsque le champ n'accepte pas les valeurs NULL .
Cela m'a arrangé!
la source
Le
DATETIME
et leDATETIME2
mappageSystem.DateTime
dans .NET - vous ne pouvez pas vraiment faire une "conversion", car c'est vraiment le même type .NET.Consultez la page de documentation MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Il existe deux valeurs différentes pour le "
SqlDbType
" pour ces deux - pouvez-vous les spécifier dans votreDataColumn
définition?MAIS: sur SQL Server, la plage de dates prise en charge est assez différente.
DATETIME
prend en charge 1753/1/1 à "éternité" (9999/12/31), tandis queDATETIME2
prend en charge 0001/1/1 à travers éternité.Donc, ce que vous devez vraiment faire est de vérifier l'année de la date - si c'est avant 1753, vous devez le changer en quelque chose APRÈS 1753 pour que la
DATETIME
colonne dans SQL Server le gère.Marc
la source
DtInit = new System.DateTime(1492, 10, 12),
échoue.Dans ma base de données SQL Server 2008, j'avais une
DateTime
colonne marquée comme non nullable, mais avec uneGetDate()
fonction comme valeur par défaut. Lors de l'insertion d'un nouvel objet à l'aide d'EF4, j'ai eu 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'est pas le cas. Ma solution était d'envoyer la valeur de date à partir du code au lieu de compter sur la base de données pour la générer.la source
Nullable<DateTime>
, et dans le code, je peux laisser cela vraiment nul (au lieu du 01/01/0000). J'ai été agréablement surpris de voir qu'EF to SQL savait ignorer ce null sur INSERT et utiliser la date du serveur (GetDate()
) ... Pour nous, c'était encore préférable car nous avions besoin d'une meilleure cohérence sur le serveur, sans nous soucier des différences d'horloge entre le serveur web et celui du serveur sql.pour moi c'était parce que le datetime était ..
dans ce cas, vous voulez vous attribuer null EF DateTime Object ... en utilisant mon code FirstYearRegistered comme exemple
la source
Celui-ci me rendait fou. Je voulais éviter d'utiliser une date / heure nullable (
DateTime?
). Je n'avais pas non plus la possibilité d'utiliser ledatetime2
type de SQL Server 2008J'ai finalement opté pour ce qui suit:
la source
[Column(TypeName = "datetime2")]
?Parfois, EF ne sait pas qu'il s'agit d'une colonne calculée ou d'un déclencheur . De par leur conception, ces opérations définiront une valeur en dehors de EF après une insertion.
Le correctif consiste à spécifier
Computed
dans les EF deedmx
cette colonne dans laStoreGeneratedPattern
propriété.Pour moi, c'était lorsque la colonne avait un déclencheur qui insérait la date et l'heure actuelles, voir ci-dessous dans la troisième section.
Étapes pour résoudre
Dans Visual Studio, ouvrez la
Model Browser
pageModel
puisEntity Types
-> puisStoreGeneratedPattern
Computed
Pour cette situation, d'autres réponses sont des solutions de contournement, dans le but de la colonne est d'avoir une heure / date spécifiée lorsque l'enregistrement a été créé, et c'est le travail de SQL pour exécuter un déclencheur pour ajouter l'heure correcte. Tels que ce déclencheur SQL:
DEFAULT (GETDATE()) FOR [DateCreated]
.la source
GETDATE()
ce que je faisais littéralement à l'époque. Mais il y a eu un commentaire récent que l'on devrait utiliserSYSDATETIME()
pour toutes les opérations DateTime2 qui je pense être vrai.J'ai rencontré cela et j'ai ajouté ce qui suit à ma propriété datetime:
la source
using System.ComponentModel.DataAnnotations.Schema;
est requisSi nous ne transmettons pas de champ 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é, elle lancera donc la conversion d'un type de données datetime2 en un type de données datetime, ce qui a entraîné une valeur hors plage
Juste
default DateTime.now
au champ de date si vous ne passez aucune date.la source
Le plus simple serait de changer votre base de données pour utiliser datetime2 au lieu de datetime. La compatibilité fonctionne bien et vous n'obtiendrez pas vos erreurs.
Vous aurez toujours envie de faire un tas de tests ...
L'erreur est probablement parce que vous essayez de définir une date sur l'année 0 ou quelque chose - mais tout dépend de l'endroit où vous avez le contrôle pour changer les choses.
la source
J'ai trouvé ce post 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 publique? PurchaseDate {get; ensemble; }
Si vous utilisez le framework d'entité Définissez la propriété nullable dans le fichier edmx sur True
la source
Comme andyuk l' a déjà souligné, cela peut se produire lorsqu'une valeur NULL est affectée à un champ DateTime non nullable . Vous envisagez de remplacer DateTime par DateTime? ou Nullable < DateTime >. Gardez à l'esprit que, si vous utilisez une propriété de dépendance , vous devez également vous assurer que le type de votre propriété de dépendance est également un type DateTime nullable.
Voici un exemple réel d'un DateTime à DateTime incomplet ? ajustement de type qui augmente le comportement étrange
la source
Entity Framework 4 fonctionne avec le type de données datetime2, donc dans db, le champ correspondant doit être datetime2 pour SQL Server 2008.
Pour parvenir à la solution, il existe deux façons.
la source
Création d'une classe de base basée sur l'implémentation de @ sky-dev. Cela peut donc être facilement appliqué à plusieurs contextes et entités.
Usage:
la source
Ajoutez l'attribut mentionné ci-dessous sur la propriété dans votre classe de modèle.
Au départ, j'ai oublié d'ajouter cet attribut. Donc, dans ma base de données, la contrainte a été créée comme
et j'ai ajouté cet attribut et mis à jour mon db puis il a été changé en
la source
Dans mon cas, nous avons jeté une date à une heure et nous avons obtenu cette erreur. Ce qui se passe, c'est que Date a un minimum "plus orienté programmeur" du 01/01/0001, tandis que Datetime est bloqué à 1753
Combinez cela avec une erreur de collecte de données de notre part, et vous obtenez votre exception!
la source
Parfois, cela fonctionne bien sur les machines de développement et non sur les serveurs. Dans mon cas, j'ai dû mettre:
Dans le fichier web.config.
Le fuseau horaire de la machine (serveur) était correct (pour les paramètres régionaux CO), mais pas l'application Web. Ce réglage est fait et cela a bien fonctionné à nouveau.
Bien sûr, toutes les dates avaient de la valeur.
:RÉ
la source
L'ajout de ce code à une classe dans ASP.NET a fonctionné pour moi:
la source
Je suis conscient de ce problème et vous devriez tous l'être aussi:
https://en.wikipedia.org/wiki/Year_2038_problem
En SQL, un nouveau type de champ a été créé pour éviter ce problème (datetime2).
Ce type de champ 'Date' a les mêmes valeurs de plage qu'une classe DateTime .Net. Cela résoudra tous vos problèmes, donc je pense que la meilleure façon de le résoudre est de changer le type de colonne de votre base de données (cela n'affectera pas vos données de table).
la source
Découvrez les deux suivants: 1) Ce champ n'a pas de valeur NULL. Par exemple:
Remplacer par:
2) Nouvelle nouvelle base de données. Par exemple:
la source
Problème avec l'attribut datetime hérité
Ce message d'erreur s'affiche souvent lorsqu'un champ de date non nullable a la valeur null au moment de l'insertion / mise à jour. Une cause peut être l'héritage.
Si votre date est héritée d'une classe de base et que vous ne faites pas de mappage, EF ne lira pas sa valeur.
Pour plus d'informations: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- choix-stratégie-directives
la source
J'ai vu cette erreur lorsque j'ai voulu modifier une page en utilisant ASP.Net MVC. Je n'ai eu aucun problème lors de la création, mais la mise à jour de la base de données a rendu ma propriété DateCreated hors de portée!
Lorsque vous ne voulez pas que votre
DateTime
propriété soit nullable et que vous ne vouliez pas vérifier si sa valeur est dans la plage sql DateTime (et@Html.HiddenFor
n'aide pas!), Ajoutez simplement unstatic DateTime
champ à l'intérieur de la classe associée (Controller) et donnez-lui la valeur lorsque GET fonctionne, puis utilisez-le lorsque POST fait son travail:la source
J'ai rencontré ce problème sur un projet d'application console simple et ma solution rapide consiste à convertir toutes les dates datetime2 possibles en datetime nullable en exécutant cette méthode:
Ce n'est certainement pas une méthode complètement complète, mais elle a fonctionné pour mes besoins et peut-être qu'elle aidera les autres!
la source
Vérifiez le format de demande dans DB. Par exemple, ma base de données a une valeur par défaut ou une liaison
(((1)/(1))/(1900))
la source
vous aurez une colonne de date qui a été définie pour lesathan la valeur minimale de l'heure autorisée comme 1/1/1001.
pour surmonter ce problème, vous pouvez définir la valeur datetime appropriée sur votre propriété et également définir une autre propriété magique comme IsSpecified = true.
la source