Ich habe den obigen Fehler in meiner App erhalten. Hier ist der Originalcode
public string GetCustomerNumber(Guid id)
{
string accountNumber =
(string)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidmyApp,
CommandType.StoredProcedure,
"GetCustomerNumber",
new SqlParameter("@id", id));
return accountNumber.ToString();
}
Ich ersetzte durch
public string GetCustomerNumber(Guid id)
{
object accountNumber =
(object)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidCRM,
CommandType.StoredProcedure,
"spx_GetCustomerNumber",
new SqlParameter("@id", id));
if (accountNumber is System.DBNull)
{
return string.Empty;
}
else
{
return accountNumber.ToString();
}
}
Gibt es einen besseren Weg, um das zu umgehen?
Antworten:
Eine kürzere Form kann verwendet werden:
BEARBEITEN: ExecuteScalar wurde nicht beachtet. Es gibt wirklich null zurück, wenn das Feld im Rückgabeergebnis fehlt. Verwenden Sie stattdessen:
quelle
null
. Wenn die ausgewählte ZeileNULL
in dieser Spalte enthalten ist, lautet der RückgabewertSystem.DBNull
.Mit einer einfachen generischen Funktion können Sie dies sehr einfach machen. Mach das einfach:
mit der Funktion:
quelle
ExecuteScalar wird zurückgegeben
Wenn Sie wissen, dass die erste Spalte der Ergebnismenge eine Zeichenfolge ist, müssen Sie zur Abdeckung aller Basen sowohl auf null als auch auf DBNull prüfen. Etwas wie:
Der obige Code basiert auf der Tatsache, dass DBNull.ToString eine leere Zeichenfolge zurückgibt.
Wenn accountNumber ein anderer Typ wäre (z. B. Ganzzahl), müssten Sie expliziter sein:
Wenn Sie sicher sind, dass Ihre Ergebnismenge immer mindestens eine Zeile enthält (z. B. SELECT COUNT (*) ...), können Sie die Prüfung auf Null überspringen.
In Ihrem Fall gibt die Fehlermeldung "Objekt vom Typ 'System.DBNull' kann nicht in Typ 'System.String' umgewandelt werden" an, dass die erste Spalte Ihrer Ergebnismenge ein DBNUll-Wert ist. Dies ist von der Besetzung bis zur Zeichenfolge in der ersten Zeile:
Marc_s 'Kommentar, dass Sie nicht nach DBNull.Value suchen müssen, ist falsch.
quelle
Sie können den Null-Koaleszenz-Operator von C # verwenden
quelle
Es gibt eine andere Möglichkeit, dieses Problem zu umgehen. Wie wäre es mit einer Änderung Ihrer Geschäftsabläufe? Mit der SQL-Funktion ISNULL (Ihr Feld, "") können Sie eine leere Zeichenfolge zurückgeben, wenn der Rückgabewert null ist.
Dann haben Sie Ihren sauberen Code als Originalversion.
quelle
Dies ist die generische Methode, mit der ich jedes Objekt konvertiere, das möglicherweise ein DBNull.Value ist:
Verwendung:
kürzer:
quelle
Ich nehme an, Sie können es so machen:
Wenn accountNumber null ist, bedeutet dies, dass DBNull keine Zeichenfolge war :)
quelle
return (accountNumber as string) ?? string.Empty;
wenn accountNumber immer noch ein istobject
. Wenn Sie Ihren Datenbankaufruf lieber auf einer eigenen Leitung halten möchten.String.Concat wandelt DBNull- und Nullwerte in eine leere Zeichenfolge um.
Ich denke jedoch, dass Sie etwas an Code-Verständlichkeit verlieren
quelle
return "" + accountNumber;
?Da ich eine Instanz habe, die nicht null ist und wenn ich mit DBNULL vergleiche, habe ich
Operator '==' cannot be applied to operands of type 'string' and 'system.dbnull'
Ausnahme erhalten, und wenn ich versucht habe, zu ändern, um mit NULL zu vergleichen, hat es einfach nicht funktioniert (da DBNull ein Objekt ist), auch wenn dies die akzeptierte Antwort ist.Ich habe mich entschieden, einfach das Schlüsselwort 'is' zu verwenden. Das Ergebnis ist also sehr gut lesbar:
data = (item is DBNull) ? String.Empty : item
quelle
Ich verwende eine Erweiterung, um dieses Problem für mich zu beseitigen, das möglicherweise das ist, wonach Sie suchen.
Es geht so:
Hinweis:
Diese Erweiterung nicht zurückgeben
null
Werte! Wenn das Elementnull
oder DBNull.Value ist , wird es einen leeren String zurück.Verwendung:
quelle
Konvertieren Sie es wie
quelle