hallo leute!
also hier ist ja nicht so viel los ..
inzwischen habe ich das problem für meinen fall gelöst:
da der MySQL Connector/.NET im zusammenhang mit dem VisualStudio-Plugin von MySQL leider gerade kein automatisches rücklesen und aktualisieren der effektiv zugewiesenen PrimaryKeys unterstützt, habe ich selber hand angelegt und mir folgende lösung gebastelt (natürlich ohne garantie, aber bei korrekter einbindung klappts ganz gut)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| void irgend_ein_init() { foreach (MySqlDataAdapter adpt in adapters) { adpt.RowUpdated += new MySqlRowUpdatedEventHandler(adpt_RowUpdated); } }
void adpt_RowUpdated(object sender, MySqlRowUpdatedEventArgs e) { if (e.StatementType == StatementType.Insert) { updateNewIDs(dsStammdaten, sender as MySqlDataAdapter, e.Row); } }
private void updateNewIDs(DataSet ds, MySqlDataAdapter adapter, DataRow insertedRow) { DataTable tab = ds.Tables[adapter.TableMappings[0].DataSetTable]; if (tab.PrimaryKey.Length > 0 && tab.ChildRelations.Count > 0) { String key = tab.PrimaryKey[0].ColumnName; long newID = adapter.InsertCommand.LastInsertedId; int oldID = (int)insertedRow[key]; tab.Rows.Find(insertedRow[key])[key] = newID; foreach (DataRelation rel in tab.ChildRelations) { if (rel.ChildColumns[0].ColumnName.Equals(key)) { foreach (DataRow row in rel.ChildTable.Select(key + "=" + oldID)) { row[key] = newID; } } } } } |
Das Backverfahren ist jetzt also:
MySQL-Datenbank: Alle Basistabellen haben eine AutoInc-Spalte als Primärschlüssel.
Designer: Import der Datenbanktabellen über des DataSource-Assistent.
- alle primärkeys haben automatisch unique, key und autoinc gesetzt, mit seed -1 und step -1.
Designer: Setzt "Hierarisches Update" auf True, um einen AdapterManager generiert zu bekommen, der das updaten gemäß der relationen übernimmt.
dies garantiert das der obige code funktioniert da die tabellen mit den primärkeys zuerst geupdatet werden, und danach alle referenztabellen.
Editor: beim laden der form / datamodule / etc (wo auch immer die adaptoren initialisiert werden) dann obigen Code zu den RowUpdated-Events der inneren MySqlDataAdaptern hinzufügen.
Runtime: arbeiten mit den programm. methode UpdateAll() vom adaptermanager benutzen, die rowupdated-events werden dann an der richtigen stelle ausgeführt.
Forms: falls ihr datagridview-komponenten benutzt, noch ein this.Validate() hinzufügen damit die evtl. angezeigten nummern aktualsiert werden.
BAM. fertig.