Laden...

INSERT;UPDATE;DELETE übere mehrere Tabellen hinweg?

Erstellt von Bartolo vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.924 Views
B
Bartolo Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren
INSERT;UPDATE;DELETE übere mehrere Tabellen hinweg?

Ich muss euch leider mit einer Anfängerfrage nerven.

Wie funktionieren Datenmanipulationen (INSERT;UPDATE;DELETE) über mehrere Tabellen hinweg?

Gehen wir mal von einem fiktivem Beispiel aus:

Tabellen:

  • "Album_Tabelle" (Enthält die Album Namen)
  • "Artist_Tabelle" (Enthält die Künstler Namen)
  • "Artist_Album_Rel" (Enthält die Zuordnungen von "Album_Tabelle" und "Artist_Tabelle")

Image

Jetzt gibt es ja erst mal grundsätzlich zwei Möglichkeit, wie die Daten vorliegen können:

Entweder über eine Join-Abfrage, dann würde man als Ergebnis sozusagen eine Tabelle zurückkriegen, die dann die Daten der 3 Tabellen enthalten würde.
Das hätte unter anderem den Vorteil, dass man die Daten auch gut in einem DatagridView anzeigen lassen kann, da dieses ja nur eine Tabelle als DataSource zulässt.

Oder zweite Möglichkeit, man fragt die Tabellen einzeln ab, und hat so z.B. hier dann 3 Tabellen in einem DataSet, was man dann wieder durch Relationen zusammenfügt.

Gehen wir mal von der ersten Möglichkeit aus.
Wenn man jetzt z.B. ein neuen Künstler und sein dazugehöriges Album eintragen will, wie muss man das angehen? Beim INSERT ist ja z.B. die Schwierigkeit, dass man ja jeweils erst noch die von der DB erstellte ID bekommen muss, bevor man in einer anderen Tabelle den Eintrag durchführen kann.

Das ganze am liebsten mit Datenadaptern.

Vielen Dank im voraus

3.728 Beiträge seit 2005
vor 17 Jahren
Transaktion

Vergiss den JOIN-Ansatz! Er wird nicht funktionieren.

Du erzeugst eine neue Transaktion (Entweder eine ADO.NET Transaktion oder eine Verteilte Transaktion mit System.Transactions). Innherhalb dieser Transaktion rufst Du für jeden DataAdapter der einzelnen Tabellen Update auf und schließt die Transaktion mit Commit ab.

B
Bartolo Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren

Super, danke. 👍

W
7 Beiträge seit 2007
vor 17 Jahren
Anzeige in einem Datagridview

Ich habe das gleiche Problem. Die Lösung hört sich gut an. Aber wie kann ich nun mehrere Tabellen in einem Datagridview anzeigen?

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von woinar
Ich habe das gleiche Problem. Die Lösung hört sich gut an. Aber wie kann ich nun mehrere Tabellen in einem Datagridview anzeigen?

Überhaupt nicht. Datagridview ist für die Anzeige einer Tabelle vorgesehen; siehe Doku. Jürgen

Nachtrag: Ausnahme gilt insofern, als Verknüpfungen über eine ComboBox möglich sind. Hinweise dazu gibt es hier über die Suche.

W
7 Beiträge seit 2007
vor 17 Jahren
Verständnisfrage

Ich verstehe einfach nicht warum die so ein tolles neues Datagrid entwickeln, wenn man nichtmal mehrere Tabellen darstellen kann. Ich denke schon, ich habe wahrscheinlich ein Verständnisproblem. Ich schilder am besten mal mein Problem.

  • Es gibt eine Tabelle Betankung in dieser stehen die Tankmenge, das Datum und zudem die MitarbeiterID, die FahrzeugID ...

  • Nun habe ich noch die Tabellen Mitarbeiter, Fahrzeug usw die jeweils den Name enthalten

Hab ich nun die Möglichkeit im neuen Datagridview die Tankmenge, das Datum, den Mitarbeiternamen und die Fahrzeugbezeichnung anzuzeigen?

W
7 Beiträge seit 2007
vor 17 Jahren
Lösung der Anzeige

Hab den Tabeladapter per joins gefüllt, nun zeigt mir das Datagridview alle nötigen infos an. Ich stand da wohl wirklich etwas auf der Leitung 🙂
Aber Spaß beiseite.. Wie kann man nun neue Einträge updaten in der Datenbank?

P
157 Beiträge seit 2006
vor 17 Jahren

Original von woinar
Ich verstehe einfach nicht warum die so ein tolles neues Datagrid entwickeln, wenn man nichtmal mehrere Tabellen darstellen kann. Ich denke schon, ich habe wahrscheinlich ein Verständnisproblem..

Du musst doch gar nicht mehrere Tabellen darstellen.. von daher macht es keinen Sinn wenn ein Datagrid mehrere darstellen könnte.

Wenn ich Dich richtig verstehe möchtest Du bestimmte Daten aus verschiedenen Tabellen anzeigen. Du kannst also zum Beispiel die gewünschten Daten, aus den verschiedenen Quelltabellen, in eine neue Zieltabelle übertragen.

Schau mal nach DataTable bzw. DataSet, das sind die Konstrukte die Du brauchst 🙂

gruß
purplestar

EDIT: ups.. offenbar war ich ein paar Minuten zu spät..

3.825 Beiträge seit 2006
vor 17 Jahren

Hinweis : CommandBuilder kann nur eine Tabelle.

Wer sich also seine SQL-Statements von einem CommandBuilder zusammenbauen lässt muss diesen pro Tabelle aufrufen.

Also : Alle Tabellen eines Dataset durchgehen und pro Tabelle Select-Statement setzen und dann Commandbuilder und ds.Update aufrufen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

W
7 Beiträge seit 2007
vor 17 Jahren
Alle Tabellen eines Dataset durchgehen

Original von BerndFfm
Hinweis : CommandBuilder kann nur eine Tabelle.

Wer sich also seine SQL-Statements von einem CommandBuilder zusammenbauen lässt muss diesen pro Tabelle aufrufen.

Also : Alle Tabellen eines Dataset durchgehen und pro Tabelle Select-Statement setzen und dann Commandbuilder und ds.Update aufrufen.

Grüße Bernd

Das hört sich super an. Ist wohl genau das, was ich gesucht habe. Nun bin ich etwas neu auf dem Gebiet. Vielleicht kann jemand mal ein Code Beispiel dazu zeigen. Würde mich riesig freuen 🙂 Ich habe nehmlich das Problem das mir der Update Command garnicht mehr zur Verfügung steht. Wenn ich nur eine Tabelle auf das Form ziehe, wird alles wunderbar automatisch erstellt. Die Komandos INSERT, DELETED und UPDATE stehe zur Verfügung. Nur als ich den DataTabel selbst befüllt habe (mit JOINS) wurde das UPDATE Komando inaktiv (also da, wo man sich die Komandos erzeugen lassen kann).

Übrigens: Danke an alle für die super schnellen Antworten.

3.825 Beiträge seit 2006
vor 17 Jahren

DbConnection conn = CreateConnection();
DbDataAdapter da = CreateDataAdapter(conn);

conn.Open();

da.SelectCommand = CreateCommand("SELECT * FROM Adressen WHERE Nummer = -99", conn);
DbCommandBuilder cb = CreateCommandBuilder(da);
count += da.Update(ds, "Adressen");

da.SelectCommand = CreateCommand("SELECT * FROM Auftraege WHERE Nummer = -99", conn);
DbCommandBuilder cb = CreateCommandBuilder(da);
count += da.Update(ds, "Auftraege");

conn.Close();

Statt DbConnection kann auch SqlConnection genommen werden.
CreateCommand() und CreateCommandBuilder() erzeugen ein Command bzw. einen Commandbuilder. Den Code dazu sag ich aber nicht 😉

Wionar : Mit Join kannst Du nicht arbeiten, das kann CommandBuilder nicht. Du musst die Tabellen des Dataset mit mehreren Befehlen füllen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

W
7 Beiträge seit 2007
vor 17 Jahren
??

Original von BerndFfm
Wionar : Mit Join kannst Du nicht arbeiten, das kann CommandBuilder nicht. Du musst die Tabellen des Dataset mit mehreren Befehlen füllen.

Aber ich kann doch nur einen TabelAdapter mit dem Datagridview anzeigen. Desahlb habe ich das DataTabel mit joins füllen müssen. Oder stehe ich schon wieder auf dem Schlauch? 🙂

3.825 Beiträge seit 2006
vor 17 Jahren

Wenn Du Join benutzt kannst Du kein CommandBuilder benutzen.

Wenn Du CommandBuilder benutzt darfst Du kein Join verwenden.

Wenn Du die Daten nur abrufst brauchst Du kein CommandBuilder.

CommandBuilder erzeugt SQL-Kommandos für Ändern, Einfügen und Löschen von Tabellenzeilen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

W
7 Beiträge seit 2007
vor 17 Jahren
CommandBuilder

Danke. Dann werd ich mich wohl mal näher belesen müssen, was der CommandBuilder eigentlich macht.

Gruß
Mathias