Laden...

[solved] komplexe MySQL-Datenbank mit mehreren Tabellen aus DataGrid updaten

Erstellt von Romschn vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.701 Views
R
Romschn Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren
[solved] komplexe MySQL-Datenbank mit mehreren Tabellen aus DataGrid updaten

verwendetes Datenbanksystem: <MySQL>

Hallo liebe Community!

Ich weiß es gibt schon zig-tausend Postings über dieses Thema aber meines ist doch sehr speziell und ich komm einfach auch nach stundenlangem Suchen nicht weiter.

Ich habe eine MySQL-Datenbank mit verschiedenen Tabellen die alle eigentlich auf, nennen wir sie Haupttabelle, durch einen Wert referenzieren - jedoch kein Key ist!
Nun habe ich eine Form die mit verschiedenen Buttons gefüllt ist, drück ich den einen Button sollen gewissen Datensätze von den verschiedenen Tabellen mit mehreren JOIN-Anweisungen in einem DataGridView angezeigt werden. Dies funktioniert auch ohne Probleme. (Hintergrund ist die Verwendung von verschiedene Abteilungen -> verschiedene Daten aus der Datenbank)

Nun ist eine Spalte in einer Tabelle leer um Bemerkungen darin hineinzuschreiben, jedoch funktioniert das mit einer einfachen adapter.Update-Funktion nicht - Ja ich weiß, funktioniert nicht über mehrere Tabellen - aber wie kann man das machen das dies doch funktioniert? Ich habe gelesen man kann sich eine eigenes Update-Statement schreiben, aber wie? Ich ändere ja die Variable von irgendeiner Zeile, kann vielleicht auch der 1000. Eintrag in der Datenbank sein aber wie merkt VS10 das dies genau dieser Eintrag ist? Schaut meine Update-Funktion dann genau so aus wie meine Select Funktion mit mehreren JOIN's und nur das ich eben den Wert reinschreibe? Vielleicht steh ich ja auch zurzeit einfach nur auf dem Schlauch X( .

Bitte um eine Antwort. Falls Ihr Code braucht um sich alles etwas besser vorzustellen kann ich natürlich auch was posten.

best regards, Romschn

T
62 Beiträge seit 2012
vor 9 Jahren

Was spricht dagegen die ID der jeweiligen Zeile für die bemerkungen mit im Grid einzulesen und beim verlassen der Zelle selbst ein Update zu bauen was sich aus dem Inhalt der Bemerkungs.zelle und der ID-Zelle zusammensetzt?

Mag nicht schön sein, ist aber simpel.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Vielleicht steh ich ja auch zurzeit einfach nur auf dem Schlauch

Das hat wohl eher damit zu tun das Leute die solche Tutorials schreiben meist keine Ahnung haben was sie tun, und selber ein Learning by doing machen.

Und die jenigen die wirkliche Arbeit machen meist keine Zeit/Lust haben ein echtes tutorial zu schreiben.

  1. Nein, das select Statement das du für einen DataAdapter zum lesen verwendest muss nichts mit dem DataAdapter zum schreiben zu tun haben.

  2. Du musst nur sicherstellen das der Datensatz den du updaten willst durch die Daten in der DataTable eindeutig identifizierbar ist.


DataTable ReadDataWitchJoin()
{
    var dt = new DataTable();
    var da = new SqlDataAdapter ( "SELECT ID, Description, ..... from MAIN_TABLE .... join... join....", m_ConnectionString );
    da.Fill(dt);
    return dt;
}

void WriteDataWithoutJoin(DataTable dt)
{
    var da = new SqlDataAdapter ( "SELECT ID, Description FROM MAIN_TABLE", m_ConnectionString );
    var cb = new SqlCommandBuilder(da);
    da.Update(dt);
}


Solange ID die Zeile in der MainTable eindeutig identifiziert, ist das so ok.
Der CommandBuilder holt sich die Daten zu "seinem" Sql und macht daraus die entsprechenden Sql Statements.

R
Romschn Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Danke erstmals für eure Antworten!

Also bleibt mir nichts andere übrig als in der Datenbank einen einzigartigen Schlüssel anzulegen oder?

T
62 Beiträge seit 2012
vor 9 Jahren

Mittlerweile sollte es doch Standard sein für jede Tabelle eine autoinc ID (MySQL) Spalte einzufügen.
Der Inhalt dieser Spalte wird vom RDBMS vergeben und ist immer unique.
Falls du keine autoinc Spalte in den Tabellen hast, kannst du sie im Nachhinein auch hinzufügen, werden dann beim Anlegen durchgezählt.

Da du aber jetzt schon JOINS verwendest müsstest du doch schon irgendeinen eindeutigen schlüssel für die Verknüpfungen in deinen Tabellen angelegt haben?

R
Romschn Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Ja ist klar das es Standard ist. Es ist auch eine autoinc ID vorhanden, aber die ist eigentlich sozusagen nicht einzigartig bzw einzigartig schon, aber mit dieser kann ich keine Relation zwischen den verschiedenen Tabellen herstellen.
Und die JOINS greifen auf verschiedenen Werte zurück, heißt soviel wie ich bastle mir aus zwei Datensätze eine ID. Ungefähr so vorzustellen:


cmd.CommandText = "SELECT tbl_1.bla, tbl_2.blub FROM ((tbl_1 LEFT JOIN tbl_2 ON (tbl_1.wert= tbl_2.wert) AND (tbl_1.pag_wert2= tbl_2.wert2)";

Ich leg jetzt einfach mal einen unique Wert an der aus mehreren Datensätzen zusammen gebaut wird, dass er wirklich einzigartig ist und versuch so die Update-Funktion dann zu nutzen.

  
DataTable ReadDataWitchJoin()  
{  
    var dt = new DataTable();  
    var da = new SqlDataAdapter ( "SELECT ID, Description, ..... from MAIN_TABLE .... join... join....", m_ConnectionString );  
    da.Fill(dt);  
    return dt;  
}  
  
void WriteDataWithoutJoin(DataTable dt)  
{  
    var da = new SqlDataAdapter ( "SELECT ID, Description FROM MAIN_TABLE", m_ConnectionString );  
    var cb = new SqlCommandBuilder(da);  
    da.Update(dt);  
}  
  
  

Solange ID die Zeile in der MainTable eindeutig identifiziert, ist das so ok.
Der CommandBuilder holt sich die Daten zu "seinem" Sql und macht daraus die entsprechenden Sql Statements.

Nur ist es so, dass ich nicht die MainTable-Update sondern eine auf die das JOIN zugreift - Funktioniert das trotzdem so einfach wenn ich dann die ID habe? Muss diese als PK definiert sein oder reicht es wenns so eindeutig ist?

T
67 Beiträge seit 2010
vor 9 Jahren

Nur ist es so, dass ich nicht die MainTable-Update sondern eine auf die das JOIN zugreift - Funktioniert das trotzdem so einfach wenn ich dann die ID habe? Muss diese als PK definiert sein oder reicht es wenns so eindeutig ist?

Hast Du jetzt in jeder Tabelle in deiner Datenbank eine eindeutige ID oder nicht? Es spielt dabei ja keine Rolle ob es eine extra ID Spalte ist oder eine Kombination aus verschiedenen Spalten. Wichtig ist nur die Eindeutigkeit.

Ich hoffe mal das ich dich richtig verstanden habe.

Du holst also mittels JOIN aus verschiedenen Tabellen Informationen in ein GridView.
Jetzt willst Du eine bestimmte Information in eine bestimmte Tabelle deiner DB zurück schreiben.

Dann frage ich mich wo ist das Problem? Es gibt nur 2 Möglichkeiten.
Hast Du die eindeutige ID des Datensatzes aus der gewünschten Tabelle mach deinen Update. Das ist kein Hexenwerk.
Wenn diese ID in deinem GridView allerdings nicht vorliegt wirst du auch kein Update machen können. Du bzw. den SQL Statement weiß ohne die eindeutige ID ja nicht wohin mit den Informationen.

R
Romschn Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Du holst also mittels JOIN aus verschiedenen Tabellen Informationen in ein GridView.
Jetzt willst Du eine bestimmte Information in eine bestimmte Tabelle deiner DB zurück schreiben.

Dann frage ich mich wo ist das Problem? Es gibt nur 2 Möglichkeiten.
Hast Du die eindeutige ID des Datensatzes aus der gewünschten Tabelle mach deinen Update. Das ist kein Hexenwerk.
Wenn diese ID in deinem GridView allerdings nicht vorliegt wirst du auch kein Update machen können. Du bzw. den SQL Statement weiß ohne die eindeutige ID ja nicht wohin mit den Informationen.

Jo das hab ich mittlerweile auch verstanden wie genau des abläuft - hab jetzt auch eindeutige ID Spalten angelegt. Nur jetzt bringt meine Update-Funktion diesen Fehler

Fehlermeldung:
Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

Das hat doch damit zu tun das er wieder nicht genau identifizieren kann um welchen Datensatz es sich handelt oder?

Sorry, dass ich soviele Fragen habe, aber mich macht das echt fertig diese ganze MySQL-Thematik X(

H
523 Beiträge seit 2008
vor 9 Jahren

Schau mal hier, da wurde die Meldung schonmal behandelt: Parallelitätsverletzung

Insbesondere der letzte Beitrag sollte Aufschluss geben.