Je ne veux pas valider txtBirthDate
alors je veux passer DateTime.MinValue
dans la base de données.
Mon code:
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = DateTime.MinValue;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
DateTime.MinValue
return Date = {1/1/0001 12:00:00 AM}
J'ai une erreur SQL:
SqlDateTime débordement. Doit être entre 1/1/1753 00:00:00 et 12/31/9999 23:59:59 PM.
Je comprends le message, mais je ne comprends pas pourquoi DateTime.MinValue
renvoie la date/heure invalide, impossible à insérer dans la base de données.
En gros, n'utilisez pas DateTime.MinValue
pour représenter une valeur manquante. Vous ne pouvez pas utiliser DateTime.MinValue
dans un champ DateTime de SQL Server, car SQL Server a une valeur minimale de début 1753.
Définissez plutôt votre propriété BirthDate
en Nullable<DateTime>
(alias DateTime?
) et définissez-la sur null
lorsque vous n’avez pas de valeur. Assurez-vous également que votre champ de base de données est nullable. Ensuite, vous devez simplement vous assurer que cette null
se termine en tant que valeur NULL
dans la base de données. Tout dépendra de votre accès aux données, ce dont vous ne nous avez rien dit.
Très simple, évitez d'utiliser DateTime.MinValue
, utilisez plutôt System.Data.SqlTypes.SqlDateTime.MinValue
.
Bien qu'il s'agisse d'une question ancienne, une autre solution consiste à utiliser datetime2 pour la colonne de base de données . MSDN Link
Voici ce que vous pouvez faire. Bien qu'il y ait beaucoup de façons d'y parvenir.
DateTime? d = null;
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = d;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
Remarque: Cela fonctionnera uniquement si la colonne datetime de votre base de données est Autoriser Null. Sinon, vous pouvez définir une valeur minimale standard pour DateTime d.
J'utilise cette fonction pour tryparse
public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
{
bool valid = false;
tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
System.Data.SqlTypes.SqlDateTime sdt;
if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
{
try
{
sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
valid = true;
}
catch (System.Data.SqlTypes.SqlTypeException ex)
{
}
}
return valid;
}
En termes simples, not utilise DateTime.MinVaue
comme valeur par défaut.
Il existe plusieurs noms MinValues
, en fonction de l'environnement dans lequel vous vous trouvez.
J'avais autrefois un projet dans lequel je mettais en œuvre un projet Windows CE. J'utilisais le DateTime.MinValue
(année 0001) du Framework, la base de données MinValue
(1753) et un contrôle d'interface utilisateur DateTimePicker
(je crois que c'était en 1970). Il y avait donc au moins 3 valeurs différentes qui conduisaient à un comportement étrange et à des résultats inattendus. (Et je crois qu’il y avait même une quatrième version (!), Je ne me souviens tout simplement pas d’où elle vient.).
Utilisez un champ de base de données nullable et remplacez votre valeur par un Nullable<DateTime>
. S'il n'y a que aucune valeur valide dans votre code, il devrait également y avoir not une valeur dans la base de données. :-)
De MSDN:
Données de date et heure du 1er janvier 1753 au 31 décembre 9999, avec un une précision de trois centièmes de seconde ou 3,33 millisecondes. Valeurs sont arrondis à des incréments de .000, .003 ou .007 millisecondes. Stockée sous forme de deux nombres entiers de 4 octets. Les 4 premiers octets stockent le nombre de jours avant ou après la date de base, le 1er janvier 1900. La date de base est le date de référence du système. Valeurs pour datetime antérieures au 1 er janvier 1753, ne sont pas autorisés. Les 4 autres octets stockent l’heure de la journée représenté comme le nombre de millisecondes après minuit. Les secondes ont une plage valide de 0 à 59.
SQL utilise un système différent de C # pour les valeurs DateTime.
Vous pouvez utiliser votre MinValue en tant que valeur sentinelle - et s'il s'agit de MinValue - transmettez null dans votre objet (et stockez la date comme nullable dans la base de données).
if(date == dateTime.Minvalue)
objinfo.BirthDate = null;
Eh bien ... c'est assez simple d'obtenir une date SQL min
DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
Si vous utilisez DATETIME2, vous devrez peut-être transmettre le paramètre spécifiquement sous le nom DATETIME2. Dans le cas contraire, il peut utilement le convertir en DATETIME et avoir le même problème.
command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;