Laden...

Nur Teilweises Datenbankupdate

Erstellt von Dr.Z vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.192 Views
Dr.Z Themenstarter:in
88 Beiträge seit 2007
vor 15 Jahren
Nur Teilweises Datenbankupdate

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.

T
327 Beiträge seit 2006
vor 15 Jahren

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

Dr.Z Themenstarter:in
88 Beiträge seit 2007
vor 15 Jahren

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?

3.825 Beiträge seit 2006
vor 15 Jahren

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

Dr.Z Themenstarter:in
88 Beiträge seit 2007
vor 15 Jahren

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.

3.825 Beiträge seit 2006
vor 15 Jahren

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

Dr.Z Themenstarter:in
88 Beiträge seit 2007
vor 15 Jahren

Hi Bernd,

Danke für deine Antwort und mit zwei kleinen Modifikation klappt das ganze. 😉

  1. Dem da.SelectCommand kann man keinen String direkt zuweisen. Musste mit mit Hilfe von
SQLCOmmand cmd = new SQLComman("SELECT * FROM " + dt.TableName";

einen Command zusammen bauen.

  1. Dann noch dem SQLCommand.Connection Propertie die SQLCOnnection zur DB mitgegeben werden.
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 🙂