Laden...

UpdateCommand auf INNER JOIN Abfrage

Erstellt von GIJOE vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.617 Views
GIJOE Themenstarter:in
142 Beiträge seit 2004
vor 19 Jahren
UpdateCommand auf INNER JOIN Abfrage

Hallo Leute!

Ich habe folgendes Problem.

Ich setze ein INNER JOIN SQL Statement an eine ACCESS Datenbank ab.
Jetzt würde ich gerne auf diese ResultTable ein UpdateCommand anwenden.
Ich weis leider nicht wie ich die Syntax formulieren soll, bei einer einfachen ResultTable ist das kein Problem.

z.B.
da_Material.UpdateCommand = new OleDbCommand("UPDATE Material SET mBez = ?, mNr = ? WHERE (mNr = ?) AND (mBez = ? OR ? IS NULL " + "AND mBez IS NULL)", conn);

Für das bessere Verständnis.

Es gibt 3 Tabellen (1. tMaterial, 2.tLagerMaterial (Junktion), 3.Lager),
die tMaterial steht mit der Lager in einer n:m Beziehung.

Bei meiner Ausgabe im DataGrid wird mir als erstes Die tMaterial Tabelle angezeigt, da ich eine Relation erstellt habe bekomme ich neben jedem Datensatz ein Pluszeichen angezeigt. Wenn ich auf das Pluszeichen klicke öffnet sich die Korospondierene ResultTabel tLagerMaterial und zeigt mir die dazugehörenden Datensätze an. Da diese aber aus zwei Tabellen besteht ist es mir im Moment leider noch nicht möglich über ein UpdateCommand die geänderten Daten zurück zuschreiben.

Bitte um Hilfe!
Bin für jeden Tip dankbar!

//Verbindung zur Datenbank
OleDbConnection dbconn = new OleDbConnection("Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=" + _DatenbankPfad + ";Mode=Share Deny None;Jet OLEDB:Engine Type=5;Provider=" + "Microsoft.Jet.OLEDB.4.0"+";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1");
//Erstellen eines DataAdapter auf eine Tabelle
OleDbDataAdapter da_Material = new OleDbDataAdapter("select mNr As Materialnummer, mBez As Bezeichnung from Material", dbconn);
//Notwendige Anweisung für Relation
da_Material.MissingSchemaAction = MissingSchemaAction.AddWithKey;
//Erstellen eines DataAdapter auf zwei Tabellen
OleDbDataAdapter da_LagerMaterial = new OleDbDataAdapter("SELECT LagerMaterial.mNr As Materialnummer, Lager.lBez As Lager, LagerMaterial.menge as Menge FROM (Lager INNER JOIN LagerMaterial ON Lager.lNr = LagerMaterial.lNr)", dbconn);
//Notwendige Anweisung für Relation
da_LagerMaterial.MissingSchemaAction = MissingSchemaAction.AddWithKey;
//DataSet zum aufnehmen der Tabelle Material und LagerMaterial
ds_Materialverwa = new DataSet("Materialverwaltung");

//Füllen der Tabelle Material
da_Material.Fill(ds_Materialverwa, "Material");
//Füllen der Tabelle LagerMaterial
da_LagerMaterial.Fill(ds_Materialverwa, "LagerMaterial");

//Relation erstellen und Beziehungen herstellen
ds_Materialverwa.Relations.Add("Material_LagerMaterial",
	ds_Materialverwa.Tables["Material"].Columns["Materialnummer"], 
	ds_Materialverwa.Tables["LagerMaterial"].Columns["Materialnummer"], 
	true);

//DataSet dem DataGrid zuweisen
daMaterial_suchen.DataSource = ds_Materialverwa;
//Als erstes anzuzeigende Tabelle
daMaterial_suchen.DataMember = "Material";

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
127 Beiträge seit 2004
vor 19 Jahren

Soviel wie ich weiß kann du ja auf die Tabellen im DataSet zugreifen und sagen "gib mir alle die sich geändert haben" (glaube "select"). Und als Ergebnis bekommst du die Rows die sich geändert haben. Dann kannst du ja wieder deine Update-Comandos zusammen bauen und an die Datenbank schicken.

Ich denke nicht das du in ein Update eine Join-Bedingung einbauen kannst, bin mir da aber nicht sicher.

U
228 Beiträge seit 2004
vor 19 Jahren

Hallo

ich gab da den Suny recht. Das Update bezieht sich nur auf eine Tabelle. Sofern eine Tabelle sich aus mehreren Tabellen zusammensetzt, muß diese eine Tabelle vom Programmierer selbst zerpflückt werden, da der Adapter so nicht weiß welcher Spalte zu welche Tabelle in welcher Situation eingespeichert werden soll. Hat man also 3 Tabellen, braucht man auch 3 Adapter um die Daten in die Datenbank zu speichern.

Hatte auch so ein ähnliches Problem und hab immer die gleiche Antwort erhalten.

Aber habe mal was gelesen, daß da in dem Punkt sich bei SQL2005 etwas ändern soll. Hab dazu aber noch nichts genaueres rausgefunden.

Gruß Olli

GIJOE Themenstarter:in
142 Beiträge seit 2004
vor 19 Jahren

Vielen Dank, ohne eure hilfe würde ich warscheinlich nächstes Jahr noch meinen das es auch mit mehreren Tabellen funktioniert.

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁