Frage

Ich habe Klasse definiert Person Eigenschaft Birthday NULL festlegbare Datetime? , also warum sollte nicht die Null-Koaleszenz Operator Arbeit im folgenden Beispiel ?

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

Der Compiler err ich erhielt, war „Operator '??' kann nicht auf Operanden vom Typ angewendet werden ‚System.DateTime?‘ und 'System.DBNull'“

Die folgenden auch einen Compiler-Fehler wurde:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

Ich habe eine Besetzung auf (Objekt), wie durch Umgestalten empfohlen, und es kompiliert, aber funktionierte nicht richtig und der Wert wurde in der Sqlserver db als null in beiden Fällen gespeichert.

SqlDbType.SmallDateTime)).Value =       
         person.Birthday ?? (object)DBNull.Value;

Kann jemand erklären, was hier los ist?

Ich brauchte den folgenden ungeschickten Code zu verwenden:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;
War es hilfreich?

Lösung

Das Problem ist, dass DateTime? und DBNull.Value ist nicht vom gleichen Typ, so dass Sie nicht die Null-Koaleszenz-Operator auf sie verwenden können.

In Ihrem Fall können Sie person.Birthday ?? (object)DBNull.Value tun einen Wert vom Typ object durch Add() passieren

Andere Tipps

Ich ziehe es iterieren meine Parameter kurz vor dem Ausführen der Abfrage, alle Instanzen von null auf DBNull gegebenenfalls zu ändern, zum Beispiel:

foreach (IDataParameter param in cmd.Parameters)
    if (param.Value == null)
        param.Value = DBNull.Value;

Das läßt mich NULL-Werte lassen, wie sie ist und sie einfach tauschen en masse später.

Ihr erstes Problem ist, dass für die ?? oder ?: Betreiber, die Objekte für beide Wahl vom gleichen Typ sein müssen. Hier sind sie unterschiedliche Art.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top