verwendetes Datenbanksystem: Oracle 10g
Hallo zusammen,
ich bin neu in der ADO.Net Programmierung und stehe vor einem (wie ich finde) heiklen Problem.
Ich lade ein DataSet mittels OracleAdapter. In der Datenbank befinden sich auch Werte, die NULL sein können Daraus resultiert, dass diese Werte nun im DataSet als DBNull abgespeichert sind, soweit ich verstanden habe.
Frage ich nun diese Werte aus dem DataSet ab, und treffe auf einen DBNull-Wert wird eine InvalidCastException geworfen. Hier der Code dazu:
DataTable tbl = ds.Tables[0];
foreach (DataRow row in tbl.Rows)
{
id = Convert.ToInt32(row[ID"]);
classtype = Convert.ToString(row["KLASSE"]);
commonname = Convert.ToString(row["NAME"]);
}
Ich versteh ja auch, dass ich nicht einfach die Datenbankrückgabe, welche DBNull ist, in einen String umwandeln kann.
Aber gibt es denn nicht eine andere Möglichkeit als jedes Mal erst eine Abfrage zu machen und zu checken, ob der Wert im DataSet DBNull ist? das war bis jetzt die einzige halbwegs vernünftige Lösung, die Google rausgeschmissen hat. Allerdings ist die für eine größere Menge an Daten vergleichsweise umständlich und auch nicht geeignet für das Projekt, dass ich zur Zeit bearbeite, da dort sehr viel auf Dynamik gesetzt wird...
Oder ist etwas mit meiner Abfragemethode nicht in Ordnung?
Ich wäre wirklich sehr dankbar für jegliche Hilfe.
Gruß,
dr_d00m
Hallo dr_d00m
Machs doch mit <Typ>.TryParse(.... oder bau dir deine eigenen Hilfsmethoden die mit DbNull umgehen können.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Hi denke auch, das es nicht anders geht,
schreib dir einfach etwas in der Art:
public static T IsNull<T>(object sourceValue,T nullReplace)
{
if(sourceValue is DBNull)
{
return nullReplace;
}
return (T)sourceValue;
}
//mit C# 3.0 brauchst du dann auch den generischen Typ nicht mehr mit zu übergeben:
object dbVal = 10;
int intDbVal = IsNull(dbVal, 0);
//intDbVal = 10;
dbVal = DBNull.Value;
intDbVal = IsNull(dbVal, 0);
//intDbVal = 0
Schade, dass man beim DataAdapter nicht einstellen kann,
dass er Datenbank Nullwerte z.B. als .NET Null Werte zurückgeben soll - oder geht das doch irgendwie?
Würde ja auch bei einfachen Typen dank der Nullable Neuerung in C# 2.0 funktionieren...
@dr_d00m:
foreach (DataRow row in tbl.Rows)
{
id = row.isNull("ID") ? -1 : (int)row[ID"];
classtype = row.isNull("KLASSE"])? string.empty: (string)row["KLASSE"];
.......
}
Und Dynamic bedeutet eher, das Du selber viel mehr Fehler händisch abfangen
musst, denn du kannst ja keine Vorgaben machen.