Laden...

Anfängerfrage: Daten aus DataSet auslesen ohne DBNull-Abfrage

Erstellt von dr_d00m vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.930 Views
dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 16 Jahren
Anfängerfrage: Daten aus DataSet auslesen ohne DBNull-Abfrage

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

5.941 Beiträge seit 2005
vor 16 Jahren

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

J
32 Beiträge seit 2008
vor 16 Jahren

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...

F
10.010 Beiträge seit 2004
vor 16 Jahren

@dr_d00m:

  1. ist es definitv schneller, erst auf null zu testen, als eine Exception zu fangen.
  2. Den Stringinhalt einer DataRow musst du nicht erst mit Convert umwandeln,
    das ist schon ein string.

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.