web-dev-qa-db-fra.com

Définir une variable DateTime vide

Je déclarerais une variable de chaîne vide comme ceci:

    string myString = string.Empty;

Existe-t-il un équivalent pour une variable 'DateTime'?

Mettre à jour :

Le problème est que j'utilise ce "DateTime" comme paramètre pour un "StoredProcedure" dans SQL . E.g:

    DateTime? someDate = null;
    myCommand.Parameters.AddWithValue("@SurgeryDate", someDate);

Lorsque j'exécute ce code, une exception est interceptée en me disant que la 'procédure stockée' attendait un paramètre '@SurgeryDate' . Mais je l'ai fourni . Vous avez une idée du pourquoi?

40
phadaphunk

Comme DateTime est un type de valeur, vous ne pouvez pas lui affecter null, mais exactement pour ces cas (absence de valeur) Nullable<T> a été introduit - utilisez plutôt une nullable DateTime:

DateTime? myTime = null;
72
BrokenGlass

Non, vous avez 2 options:

DateTime date = DateTime.MinValue;

Cela fonctionne lorsque vous devez faire quelque chose chaque X fois (puisque vous serez toujours au-dessus de MinValue) mais peut en réalité causer des erreurs subtiles (telles que l'utilisation de certains opérateurs sans vérifier d'abord si vous n'êtes pas MinValue) si vous ne faites pas attention .

Et vous pouvez utiliser Nullable:

DateTime? date = null;

Qui est Nice et évite la plupart des problèmes en introduisant seulement 1 ou 2.

Cela dépend vraiment de ce que vous essayez d’atteindre.

24
Shahar Prish

Vous pouvez définir une variable DateTime sur '1/1/0001 00:00:00' mais la variable elle-même ne peut pas être nulle. Pour obtenir cette utilisation de MinTime:

DateTime variableName = DateTime.MinValue;
11
Brian Warfield

Vous voudrez peut-être utiliser une date et heure nullable. Datetime? someDate = null;

Vous pouvez trouver des exemples de personnes utilisant DateTime.Max ou DateTime.Min dans de tels cas, mais je doute fort que vous souhaitiez le faire. Cela conduit à des bugs avec les cas Edge, un code plus difficile à lire, etc.

6
Servy

La méthode que vous avez utilisée (AddWithValue) ne convertit pas les valeurs null en valeurs null de la base de données. Vous devriez utiliser DBNull.Value à la place:

myCommand.Parameters.AddWithValue(
    "@SurgeryDate", 
    someDate == null ? DBNull.Value : (object)someDate
);

Cela passera la valeur someDate s'il ne s'agit pas de null ou de DBNull.Value sinon. Dans ce cas, la valeur correcte sera transmise à la base de données.

5
Alex

Si vous définissez la date à 

DateTime dNewDate = new DateTime();

La valeur est définie sur {1/1/0001 12:00:00 AM}

4
Chris Catignani

Non plus:

DateTime dt = new DateTime();

ou

DateTime dt = default(DateTime);
4
iliketocode

Option 1: Utiliser un DateTime nullable?

Option 2: Utiliser DateTime.MinValue

Personnellement, je préférerais l'option 1.

3
Matt Burland

Une string est une séquence de caractères. Il est donc logique d’avoir une string vide, qui est juste une séquence vide de caractères.

Mais DateTime est juste une valeur unique, il n’a donc aucun sens de parler de «vide» DateTime.

Si vous voulez représenter le concept de «pas de valeur», cela est représenté par null en .Net. Et si vous voulez utiliser cela avec des types de valeur, vous devez explicitement les rendre nuls. Cela signifie soit en utilisant Nullable<DateTime>, soit l'équivalent DateTime?.

DateTime (comme tous les types de valeur) a également une valeur par défaut , qui est assignée aux champs non initialisés et vous pouvez également l'obtenir par new DateTime() ou default(DateTime). Mais vous ne voulez probablement pas l'utiliser, car il représente une date valide: 1.1.0001 0:00:00.

3
svick

Il n'y a pas de date vide en tant que telle. Voulez-vous dire quelque chose comme:

DateTime? myDateTime = null;
1
Jamie Keeling

Le .addwithvalue besoin de dbnull . Vous pourriez faire quelque chose comme ceci:

DateTime? someDate = null;
//...
if (someDate == null)
    myCommand.Parameters.AddWithValue("@SurgeryDate", DBnull.value);

ou utilisez une extension de méthode ...

  public static class Extensions
    {
        public static SqlParameter AddWithNullValue(this SqlParameterCollection collection, string parameterName, object value)
        {
            if (value == null)
                return collection.AddWithValue(parameterName, DBNull.Value);
            else
                return collection.AddWithValue(parameterName, value);
        }
    }
0
Chris Catignani