Das Setzen des Parameters auf DBNull.Value unter Verwendung der ternären Syntax gibt einen Fehler aus.

Ich habe das folgende Bit Code zum Festlegen eines Parameters, der in einer INSERT-Anweisung zum Festlegen einer VARCHAR-Spalte in einer SQL Server-Datenbank verwendet wird. Mein Wertobjekt (mit dem Namen ilo) hat eine Eigenschaft mit dem Namen Description, die auf String.Empty initialisiert wird und dann entweder auf einen aus XML gelesenen Wert gesetzt wird, oder wenn dieses XML-Element leer ist, bleibt es einfach als String.Empty.

Wenn also beim Einfügen in die Datenbank die Eigenschaft immer noch auf String.Empty festgelegt ist, möchte ich, dass sie einen Nullwert einfügt.

database.AddInParameter(cmd, "@description", DbType.String, 
                           (ilo.Description.Equals(string.Empty)) ?
                            DBNull.Value :
                            ilo.Description);

Im Grunde genommen sage ich, wenn ilo.Description gleich string.empty ist, setze den Parameter auf DBNull.Value, andernfalls setze er auf ilo.Description.

Dies gibt den folgenden Fehler in Visual Studio ...

Fehler 141 Der Typ des bedingten Ausdrucks kann nicht bestimmt werden, da keine implizite Konvertierung zwischen 'System.DBNull' und 'string' erfolgt.

Warum?

Der merkwürdige Teil ist, dass ich das Folgende ohne Fehler ausführen kann, was genau dasselbe sein sollte wie bei der Verwendung der bedingten Inline-Syntax wie oben!?!

if(ilo.Description.Equals(string.Empty))
{
    database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
    database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}

Ich habe nach anderen Posts gesucht und den folgenden gefunden, aber meine Frage wurde nicht wirklich beantwortet.

EntLib-Methode zum Binden des "Null" -Werts an den Parameter

Ich interessiere mich mehr für WARUM, weil die offensichtliche Problemumgehung darin besteht, nur eine if / else-Anweisung anstelle der (ternären) Inline-Syntax zu verwenden.

Es gibt eine Art Antwort auf diesen Link, aber ich hätte gerne eine bessere Erklärung, weil es für mich so aussieht, als würde es nicht funktionieren. Ich würde es einen Bug nennen!

http://msdn.microsoft.com/en-us/library/ty67wk28.aspx

Antworten auf die Frage(4)

Ihre Antwort auf die Frage