Hallo Leute,
zuerst einmal finde ich dieses Forum echt Klasse. Ich habe aus den Beiträgen schon viele Ideen schöpfen können.
Nun komme ich nicht weiter, und weder im Forum noch anderswo kann ich eine Lösung dazu finden.
Ich lade aus einer externen Datei mehrere Datensätze, die in verschiedene Tabellen gespeichert werden müssen. Da ich vorher nicht weiss welche Tabelle füge ich mehrere Tabellen dem Dataset hinzu und erzeuge eine Tabellenzeile zu der jeweiligen Tabelle :
conn = new SqlConnection(connStr);
ds = new DataSet();
da = new SqlDataAdapter( sqlstr, conn);
cb = new SqlCommandBuilder(da);
DataRow rw = null;
try
{
conn.Open();
ds.Clear();
da.SelectCommand.CommandText = "SELECT * FROM table1";
ds.Tables.Add("table1");
count = da.Fill(ds,"table1");
da.SelectCommand.CommandText = "SELECT * FROM table2";
//cb.RefreshSchema();
ds.Tables.Add("table2");
count = da.Fill(ds, "table2");
da.SelectCommand.CommandText = "SELECT * FROM table3";
ds.Tables.Add("table3");
count = da.Fill(ds, "table3");
}
catch (Exception ex)
{
}
conn.Close();
while (...)
{
// Datensatzanfang, dat = Name der Tabelle
rw = ds.Tables[dat].NewRow();
// Felder zuordnen
rw[fname1] = str1;
rw[fname2] = str2;
// Datensatz einfügen
ds.Tables[dat].Rows.Add(rw);
try
{
conn.Open();
count = da.Update(ds, dat);
}
catch (Exception ex)
{
MessageBox.Show("Datenbank-Fehler : " + ex.Message);
}
}
Beim Ausführen des da-Update-Befehls bekomme ich die Fehlermeldung DataColumn 'dat3_spalte1' in der DataTable 'table1' für SourceColumn 'dat3_spalte1' ist nicht vorhanden"
Ich habe inzwischen festgestellt, dass es am ComandBuilder liegt, der seien Insert-Befehl nur für eine Tabelle erstellt hat.
Auch Probieren mit cb.RefreshSchema() und Anlegen von mehreren Comandbuildern hat keinen Erfolg gebracht.
An welcher Stelle muss ich denn eigentlich den Commandbuilder erstellen ?
Wie kann ich Commandbuilder für mehrere Tabellen erstellen ? Erkennt er dann welchen Insert-Befehl er benutzen muss ?
Danke für eure Bemühungen,
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Du brauchst pro Tabelle einen DataAdapter
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hi,
ich habs selbst rausgefunden :
Vor dem Befehl da.Update habe ich eingefügt :
cb.Dispose();
da.SelectCommand.CommandText = "SELECT * FROM "+dat;
cb = new SqlCommandBuilder(da);
Jetzt wird vor jedem Einfügen eines neues Datensatzes der Insert-String neu aufgebaut. Da dies nur im Hauptpeicher stattfindet sollte das auch schnell gehen.
Programmierhans : Da die Routine mit allen Datenbanken funktionieren soll wollte ich die Verwendung von mehreren Datasets und DataAdapters verhindern. Es können über 100 Tabellen gleichzeitig sein die da angesprochen werden.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3