web-dev-qa-db-fra.com

Débordement DateTime.MinValue et SqlDateTime

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.

45
Shree

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.

76
Jon Skeet

Très simple, évitez d'utiliser DateTime.MinValue, utilisez plutôt System.Data.SqlTypes.SqlDateTime.MinValue.

69
Sankar M

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

9
Abhay Kumar

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.

3
Praveen Nambiar

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

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

2
Jens H

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;
2
Dave Bish

Eh bien ... c'est assez simple d'obtenir une date SQL min

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
0
Richard Barker

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;
0
David Homer