Frage

Ich habe ein DateTime?, die ich in ein Feld einzufügen bin versucht, eine DbParameter verwenden. Ich erstelle die Parameter wie folgt:

DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";

Und dann will ich den Wert des DateTime? in die dataPrm.Value setzen, während für nulls Buchhaltung.

Ich dachte zunächst würde ich klug sein:

datePrm.Value = nullableDate ?? DBNull.Value;

, aber das schlägt mit dem Fehler

  

Operator '??' kann nicht auf Operanden vom Typ angewandt werden ‚System.DateTime?‘ und 'System.DBNull'

Also ich denke, das funktioniert nur, wenn das zweite Argument eine Nicht-Nullable-Version des ersten Arguments ist. Also ging ich für:

datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;

, aber das funktioniert auch nicht:

  

Art des bedingten Ausdrucks kann nicht bestimmt werden, weil es keine implizite Konvertierung zwischen ‚System.DateTime‘ und ‚System.DBNull‘

Aber ich will nicht zwischen diesen Typen konvertieren!

Bisher ist die einzige Sache, die ich an der Arbeit bekommen kann, ist:

if (nullableDate.HasValue)
  datePrm.Value = nullableDate.Value;
else
  datePrm.Value = DBNull.Value;

Ist das wirklich die einzige Art, wie ich dieses schreiben kann? Gibt es eine Möglichkeit, einen Einzeiler mit dem ternären Operator zur Arbeit zu kommen?

Update: Ich verstehe wirklich nicht, warum das ?? Version funktioniert nicht. MSDN sagt:

  

Die ?? Operator gibt den linken Operanden, wenn es nicht null ist, sonst gibt er den rechten Operanden.

Das ist genau das, was ich will!

Update2: Nun, es war ziemlich offensichtlich am Ende:

datePrm.Value = nullableDate ?? (object)DBNull.Value;
War es hilfreich?

Lösung

Ah ha! Ich fand eine noch effizientere Lösung als @ Trebz ist!

datePrm.Value = nullableDate ?? (object)DBNull.Value;

Andere Tipps

Wenn Sie SQLServer verwenden, die System.Data.SqlTypes Namespace enthält einige Utility-Klassen, die das lästige Art Gießen vermeiden. Zum Beispiel statt dies:

var val = (object) "abc" ?? DBNull.Value;

Sie können schreiben:

var val = "abc" ?? SqlString.Null;

Es würde funktionieren, wenn Sie verwenden

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;

Wenn Sie mit C # 3.0 können Sie eine Erweiterungsmethode erstellen, dies zu tun einfach:

public static class DBNullableExtensions
{
    public static object ToDBValue<T>(this Nullable<T> value) where T:struct
    { 
        return value.HasValue ? (object)value.Value : DBNull.Value;
    }
}


class Program
{
    static void Main(string[] args)
    {
        int? x = null;

        Console.WriteLine(  x.ToDBValue() == DBNull.Value );
    }
}

ich glaube, der Fehler mit dem zweiten Versuch ist darauf zurückzuführen, nullableDate.Value und DBNull.Value verschiedene Typen und den ternären Operator sein, um einen Typen zu holen in beiden Fällen zurückzukehren. Ich habe nicht die Umwelt dies zu testen, aber ich denke, das sollte für Sie arbeitet:

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : (object)DBNull.Value;

Die Art und Weise, dass ich es tun, ist ich eine statische Utility-Klasse, die gerade durch und prüft, geht, um zu sehen, ob der Parameterwert null ist, dann habe ich den Wert DBNull zu tun. Ich tue nur, dass, bevor ich das Ausführen aufrufen.

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