Hallo zusammen
Irgendwie wird mein DataSet immer wieder gelöscht/überschrieben. Wahrscheinlich bloss ein dummer Anfängerfehler, aber ich komm nicht darauf... Ich lade Tabelleninhalte in ComboBoxen aber nur bei der letzten "Befüllung" werden die Daten angezeigt.
oDB.DB2conn();
// ComboBoxen "Anrede" füllen
DataSet oDSAnr = oDB.cmbBx_Load("SELECT * FROM ANREDE", "ANREDE");
hanrede_cmbBx.DataSource = oDSAnr.Tables["ANREDE"];
hanrede_cmbBx.DisplayMember = "ANR_BEZEICHNUNG";
hanrede_cmbBx.ValueMember = "ANR_CODE";
hanrede_cmbBx.DataSource = oDSAnr.Tables["ANREDE"];
vanrede_cmbBx.DisplayMember = "ANR_BEZEICHNUNG";
vanrede_cmbBx.ValueMember = "ANR_CODE";
// ComboBox "Wunschcode" füllen
DataSet oDSWun = oDB.cmbBx_Load("SELECT * FROM WUNSCHCODE", "WUNSCHCODE");
hwun_cmbBx.DataSource = oDSWun.Tables["WUNSCHCODE"];
hwun_cmbBx.DisplayMember = "WC_BEZEICHNUNG";
hwun_cmbBx.ValueMember = "WC_CODE";
public DataSet cmbBx_Load(string cmd, string table)
{
oDS.Clear();
oDB2Conn.Close();
oDB2Conn.Open();
oDB2DaAdap = new DB2DataAdapter(cmd, oDB2Conn.ConnectionString);
oDS = new DataSet();
oDB2DaAdap.FillSchema(oDS, SchemaType.Source, table);
oDB2DaAdap.Fill(oDS, table);
return oDS;
}
Danke für eine schnelle Antwort!
Original von invisible
public DataSet cmbBx_Load(string cmd, string table) { oDS.Clear(); oDB2Conn.Close(); oDB2Conn.Open(); oDB2DaAdap = new DB2DataAdapter(cmd, oDB2Conn.ConnectionString); oDS = new DataSet(); oDB2DaAdap.FillSchema(oDS, SchemaType.Source, table); oDB2DaAdap.Fill(oDS, table); return oDS; }
Zeile 3 ist fatal. Da löschst du den Inhalt des Datasets wieder. Nicht böse sein, aber die Logik ist generell daneben, daher passieren auch solche Fehler. In der Funktion oben mußt du ein einzelnes DataSet und einen DataAdapter definieren. Das DataSet wird dann am Ende zurückgegeben. Etwa so:
public DataSet cmbBx_Load(string cmd, string table)
{
DataSet dataSet = new DataSet();
DB2DataAdapter adapter = new DB2DataAdapter(cmd, oDB2Conn.ConnectionString);
// die beiden zeilen sind überflüssig, da du oben den ConnectionString benutzt und nich die COnnection selbst
//oDB2Conn.Close();
//oDB2Conn.Open();
adapter.FillSchema(dataSet , SchemaType.Source, table);
adapter.Fill(dataSet , table);
return dataSet ;
}
([bb]|[^b]{2})
Was soll ich sagen... X( du hast natürlich vollkommen recht. Sind meine ersten Gehversuche mit DataSet.
Das mit der Connection ist wirklich Blödsinn... Nur das mit [DataSet].Clear(); verstehe ich nicht ganz... was macht der Befehl den genau?
Jedenfalls funktioniert es jetzt 🙂 Danke vielmals!!! Das hilft mir echt, da ich echt unter Zeitdruck stehe. In meinem Code wird es noch viele etwas verkorkste Dinge haben.
Gruss invisible
PS: sry dass ich es ins falsche Unterform gepostet habe...
Original von invisible
Nur das mit [DataSet].Clear(); verstehe ich nicht ganz... was macht der Befehl den genau?
Original aus der SDK Dokumentation
Entfernt alle Daten aus dem DataSet, indem alle Zeilen in sämtlichen Tabellen entfernt werden.
Hmm ich dachte, dass die vorher verwendeten Daten nicht mehr an den DataSet gebunden sind und ihn bereinige bevor ich die nächsten Daten einlese... das war wohl der Denkfehler... 😉
klappt das mit dem "using" eigentlich bei database-connections auch so schmuck wie bei file-I/O?
und @ invisible: glaub mir, jeder, der in ADO.NET einsteigt, kriegt erstmal nen knoten in der birne, bis er nach und nach erkennt, wie elegant der entwurf eigentlich ist. vor allem lernt man eigentlich sehr schnell sehr viel bei dem thema und blickt nach ein paar experimenten recht flott durch. man sollte sich bloß nicht von der MSDN verwirren lassen, weil die so viele wege nach rom aufzeigt, dass man am ende nicht mehr weiß, welcher für welchen fall der richtige ist 😉
/// <summary>
/// Signatur
/// </summary>
Original von CarstenP
klappt das mit dem "using" eigentlich bei database-connections auch so schmuck wie bei file-I/O?
Ja, das geht für einige Data-Klassen wie Connections, Commands, Readers, oder Transactions. Eben alles was IDisposable einbindet 🙂
([bb]|[^b]{2})
das heißt, wenn ich von ner klasse erbe oder eine erstelle, die IDisposable implementiert, geht das auch bei eigenen? klasse klasse 🙂
/// <summary>
/// Signatur
/// </summary>
Jups 🙂
Muß man natürlich gucken, obs wirklich sinnvoll ist Dispose einzubinden. Dies ist der Fall, wenn man externe Resourcen verwendet und freigeben muß oder wenn man andere IDiposable-Klassen einsetzt und dessen Resourcen auch freigeben möchte.
([bb]|[^b]{2})