Der folgende Code gibt einen Fehler aus: "Keine implizite Konvertierung von DBnull nach int."
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
c#
dbnull
sqlparameter
Relativität
quelle
quelle
==
am Ende der 3. Zeile?)Antworten:
Das Problem besteht darin, dass der
?:
Operator den Rückgabetyp nicht ermitteln kann, da Sie entweder einenint
Wert oder einen Wert vom Typ DBNull zurückgeben, die nicht kompatibel sind.Sie können die Instanz von AgeIndex natürlich als Typ umwandeln,
object
der die?:
Anforderung erfüllt.Sie können den
??
Null-Koaleszenz-Operator wie folgt verwendenHier ist ein Zitat aus der MSDN-Dokumentation für den
?:
Bediener, das das Problem erklärtquelle
AgeItem.AgeIndex as object
??
dieselbe Lösung, als ob Sie das reguläre Ternär verwenden würden?:
- Sie müssen immer nochAgeItem.AgeIndex
ein Objekt umwandeln :planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
, um einen typspezifischen Vergleich durchzuführen , funktioniert das Umwandeln des gesamten Ausdrucks nicht. Sie haben die nicht-DBNull Parameter wie so würfensomeID == 0 ? DBNull.Value : (object)someID
Die akzeptierte Antwort schlägt vor, eine Besetzung zu verwenden. Die meisten SQL-Typen verfügen jedoch über ein spezielles Nullfeld, mit dem diese Umwandlung vermieden werden kann.
Beispiel:
SqlInt32.Null
"Stellt einen DBNull dar, der dieser Instanz der SqlInt32-Klasse zugewiesen werden kann."quelle
exampleNoCast
wird als Objekt deklariert, sodass die Umwandlung in ein Objekt weiterhin erfolgt. Wenn der Wert wie im OP-Code direkt SqlParameter.Value zugewiesen wird, der ebenfalls vom Typ object ist, erhalten Sie trotzdem die Umwandlung.Sie müssen
DBNull.Value
in SQLCommand als Nullparameter übergeben werden, es sei denn, in der gespeicherten Prozedur ist ein Standardwert angegeben (wenn Sie eine gespeicherte Prozedur verwenden). Der beste Ansatz besteht darin,DBNull.Value
fehlende Parameter vor der Ausführung der Abfrage zuzuweisen. Wenn Sie foreach folgen, wird der Job ausgeführt.Andernfalls ändern Sie diese Zeile:
Wie folgt:
Da Sie in bedingten Anweisungen keine unterschiedlichen Wertetypen verwenden können, unterscheiden sich DBNull und int voneinander. Hoffe das wird helfen.
quelle
Versuchen Sie Folgendes mit einer Codezeile:
quelle
Versuche dies:
quelle
Wenn Sie den bedingten (ternären) Operator verwenden, benötigt der Compiler eine implizite Konvertierung zwischen beiden Typen, andernfalls erhalten Sie eine Ausnahme.
Sie können das Problem beheben, indem Sie eines von beiden auf Folgendes übertragen
System.Object
:Da das Ergebnis jedoch nicht wirklich hübsch ist und Sie sich immer an dieses Casting erinnern müssen, können Sie stattdessen eine solche Erweiterungsmethode verwenden:
Dann können Sie diesen kurzen Code verwenden:
quelle
Meiner Meinung nach ist es besser, dies mit der Parameters- Eigenschaft der SqlCommand- Klasse zu tun :
quelle
DBNull.Value
, könnte es ADO.NET etwas schwer fallen zu erraten, welcher SqlDbType das sein könnte ........ dies ist praktisch - aber ein bisschen gefährlich ....Erwägen Sie die Verwendung der verfügbaren Nullable (T) -Struktur. Sie können nur Werte festlegen, wenn Sie diese haben, und Ihre SQL-Befehlsobjekte erkennen den nullbaren Wert und verarbeiten ihn entsprechend, ohne dass Sie Probleme damit haben.
quelle
quelle
Versuche dies:
Mit anderen Worten, wenn der Parameter null ist, senden Sie ihn einfach nicht an Ihren gespeicherten Prozess (vorausgesetzt natürlich, dass der gespeicherte Prozess null Parameter akzeptiert, was in Ihrer Frage impliziert ist).
quelle
versuchen Sie so etwas:
quelle
Ich löse so.
quelle
quelle
Das mache ich einfach ...
quelle
quelle
Eine einfache Erweiterungsmethode hierfür wäre:
quelle
Ich benutze eine einfache Methode mit einer Nullprüfung.
quelle
Mein Code, der in einem realen Projekt arbeitet Schauen Sie sich den ternären Operator an, bevor Sie den SQL-Parameter erstellen. Dies ist der beste Weg für mich, ohne Probleme:
quelle