verwendetes Datenbanksystem: MS SQL Server 2005 Express Edition
Hallo zusammen.
ich komme einfach nicht mehr weiter. Auch die Suche im Forum hat mir viele nützliche Tips geliefert, aber jetzt bin ich wirklich mit meinen Ideen am Ende.
Habe auch die KApitel des OpenBooks dazu gelsen 🤔 X( ?(
Ich habe eine Datenbank mit 4 Tabellen.
Mit
MyAdapter = new SqlDataAdapter(SQLStatement, MySQLConnection);
db_dpterm = new DataSet("db_dpterm");
MyAdapter.Fill(db_dpterm);
hole ich mir die (leere) Datenbank in mein Programm.
Anschließend möchte ich in die einzelnen Tabellen des DatsSets neue Zeilen anfügen. Das klappt auch alles soweit:
if (!TableContainsKey(tbl_Auftrag, "auftragsnr= " + Auftragsnummer + " AND kundennr=" + Kundennummer + " AND teileID=" + TeileID.ToString()))
{
DataRow NewRow = db_dpterm.Tables["tbl_Auftrag"].NewRow();
NewRow[0] = Auftragsnummer;
NewRow[1] = Kundennummer;
NewRow[2] = TeileID.ToString();
NewRow[3] = Datum;
db_dpterm.Tables["tbl_Auftrag"].Rows.Add(NewRow);
}
(Dies ist ein Beispiel für eine Tabelle. Alle anderen Tabellen fülle ich genau so. Das ganze wird (für alle Tabellen) in einer Schleife durchlaufen)
Vor meinem
MyAdapter.Update(db_dpterm);
weisen die Tabellen des DataSets alle die richtigen Einträge auf.
Mache ich das Update und möchte ich mir die Daten über die MS SQL Mangement Studio Console angucken, stelle ich erstaunt fest, dass nur die eine Tabelle (Tabelle Kunde --> eine Spalte --> Kundennummer) neue Werte besitzt.
Alle anderen Tabellen sind weiterhin komplett leer. Ich komm einfach nicht dahinter, woran das liegt.
Wenn wenigstens keine Tablle mit Werten gefüllt werden würde, wäre das irgendwie verständlicher, aber nur die eine Tabelle und die anderen nicht? da steige ich einfach nicht hinter.
Hoffe ihr habt da noch eine greifende Idee, ich häng nun schon fast den ganzen Tag dran. Ich habe sämtliche möglichkeiten ausprobiert.
Also auf den ersten Blick würde ich sagen, dass du ja einen TableAdapter verwendest, der anhand deiner Abfrage automatisch generiert wird.
Dieser Table Adapter kennt logischerweise daher auch nur die eine Tabelle...
Was du brauchst sind TableAdapter für die anderen Tabellen, die du befüllen willst. Diese musst du dann auch auf das DataSet anwenden (Update), dann sollten deine Einträge da sein...
Ich benutze doch einen SQL Data Adapter. Mit diesem stelle ich die Verbindung zur DB her und hole mir doch mit
MyAdapter.Fill(db_dpterm);
alle Tabellen meiner DB in mein DataSet.
Ich kann ja auch alle einzelnen Tabellen per Index oder vorheriges TableMapping ansprechen und Werte hinzufügen.
Nur das Updaten fnktioniert nicht (richtig). Oder meinst du, dass ich für jede einzelne Tabelle ein eigenes DataSet respektive einen SQLAdapter erstellen?
Nein,
Du musst Du das db_dpterm.Tables["..."].Rows.Add(NewRow) einmal pro Tabelle machen.
Ich seh in Deinem Source nur eine Tabellenzeile die du hinzufügst.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Hi Bernd,
danke für deine Antwort. Da habe ich mich wohl undeutlich ausgedrückt. Das ist nur ein Beispiel für eine Tabelle. Die Anderen Tabellen fülle ich genau so.
Also auch die Zeile erstellen, mit Daten füllen und dann an die Tablle anfügen.
Diese Anweisungen werden in einer Schleife durchlaufen. Ist diese beendet will ich das ganze DataSet dann wieder in die Datenbank schieben, aber das scheint ja aus einem mir nicht bekannten Grund nicht zu funktionieren. Habt ihr sonst noch eine Idee?
UPDATE:
Da sonst niemand eine Idee hat, präsentiere ich euch einfach mal meine momentane Vorgehensweise:
Da das Updaten der kompletten Datenbank mittels des DataSets nicht funktioniert, arbeite ich mit dem normalen SQLCommand. Ich mache ein Insert mit den entsprechenden Daten auf die Datenbank.
Vorher überprüfe ich jedoch mittels
DataTable.Select(SQLStatement);
ob dieser Datensatz schon in der Tabelle vorhanden ist.
Bei dieser DataTable handelt es sich allerding um eine Tabelle in meinem lokalen DataSet.
Ist der anzufügende Datensatz noch nicht vorhanden, so wird er mit dem oben angesprochenen SQLCommand an die Datenbank direkt angefügt. Zusätzlich muss ich diesen Datensatz an mein internes DataSet anfügen, damit die folgenden Abfrageprüfungen einen Sinn ergeben und nicht ins Leere laufen.
Das ganze klappt zwar, aber ich finde dies ist nicht wirklich elegant gelöst. Optimal wäre es meiner Meinung nach, wenn man das DataSet mit neuen Daten / Zeilen / Datensätzen füllt und mittels eines
SQLDataAdapter.Update(DataSet);
wieder alles in die Datenbank schieben könnte.
Für neue / weitere Hilfen, Anregungen und Infos würde ich mich freuen.
Hallo Dr. Z.,
ich denke der Commandbuilder kann nicht mehrere Tabellen auf einmal speichern.
Ich mache das so :
SqlDataAdapter da;
SqlCommandbuilder cb;
foreach (DataTable dt in ds.Tables)
{
da.SelectCommand = "select * from " + dt.Tablename + " where 0=1";
cb = new SqlCommandBuilder(da);
da.Update(ds, dt.Tablename);
}
Hab ich aus dem Kopf getippt, ohne Gewehr 😉
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Hi Bernd,
Danke für deine Antwort und mit zwei kleinen Modifikation klappt das ganze. 😉
SQLCOmmand cmd = new SQLComman("SELECT * FROM " + dt.TableName";
einen Command zusammen bauen.
SQLCommand.Connection = SQLConnection;
Anschließend wie du bereits erwähnt hast den CommandBuilder initialisieren und los gehts mit
SQLDataDataAdapter.Update(DataSet, TableName);
Vielen Dank für deine Hilfe 🙂