Dank Visual Studio und Microsoft .NET in der Version 2 ist es ein leichtes, eine Master-Detail-Beziehung zwischen zwei Tabellen in einem Dataset nachzubilden und auch im Formular zu bearbeiten. Die Erstellung des Datasets übernimmt ein Assistent. Die Controls im Formular werden per Drag&Drop platziert. Dabei wird im Code auch automatisch Code zur Aktualisierung der Datenbank angelegt:
myMasterTableBindingSource.EndEdit();
myDetailTableBindingSource.EndEdit();
tableAdapterManager.UpdateAll(dataSetmyTables); |
myMasterTableBindingSource.EndEdit();
myDetailTableBindingSource.EndEdit();
tableAdapterManager.UpdateAll(dataSetmyTables);
Soweit, so gut. Leider kann sich für den Anwender dadurch Datenverlust ergeben. Wir ein Detail-Datensatz bearbeitet und dann der Master-Datensatz gewechselt, so bleibt der Detail-Datensatz im Edit-Modus! Mit
myDetailTableBindingSource.EndEdit(); |
myDetailTableBindingSource.EndEdit();
ist dieser Datensatz nicht mehr zu erreichen und wird auch nicht beim UpdateAll berücksichtigt. Eine Abhilfe schafft hier:
for (int i = 0; i < dataSetmyTables.myMasterTable.Count; i++)
{ dataSetmyTables.myMasterTable[i].EndEdit(); }
for (int i = 0; i < dataSetmyTables.myDetailTable.Count; i++)
{ dataSetmyTables.myDetailTable[i].EndEdit(); }
tableAdapterManager.UpdateAll(dataSetmyTables); |
for (int i = 0; i < dataSetmyTables.myMasterTable.Count; i++)
{ dataSetmyTables.myMasterTable[i].EndEdit(); }
for (int i = 0; i < dataSetmyTables.myDetailTable.Count; i++)
{ dataSetmyTables.myDetailTable[i].EndEdit(); }
tableAdapterManager.UpdateAll(dataSetmyTables);
ConnectionStrings werden von Visual Studio automatisch in die Anwendungseinstellungen übernommen und beinhalten bei lokalen Datenbanken (beispielsweise VistaDB) üblicherweise auch den absoluten Pfad. Für Asp.Net bietet sich wohl eine solche Lösung an:
Data Source=|DataDirectory|\MyDatabase.vdb3
Das funktioniert aber nicht bei WinForm-Anwendungen, weil es das DataDirectory dort nicht gibt. In dem Falle kann man den ConnectionString aber für die Entwicklungsumgebung fix setzen und dann einfach zur Laufzeit korrigieren:
string connString = global::MyLib.Properties.Settings.Default.ConnectionStringMyApp;
string dbName = "MyDatabase.vdb3";
Int32 startPos = connString.IndexOf("Data Source =\"") + 13;
Int32 endPos = connString.IndexOf(dbName + "\"") + dbName.Length;
connString = connString.Substring(0, startPos + 1) +
"D:\\MyDataDir\\" + dbName + connString.Substring(endPos);
global::MyLib.Properties.Settings.Default["ConnectionStringMyApp"] = connString; |
string connString = global::MyLib.Properties.Settings.Default.ConnectionStringMyApp;
string dbName = "MyDatabase.vdb3";
Int32 startPos = connString.IndexOf("Data Source =\"") + 13;
Int32 endPos = connString.IndexOf(dbName + "\"") + dbName.Length;
connString = connString.Substring(0, startPos + 1) +
"D:\\MyDataDir\\" + dbName + connString.Substring(endPos);
global::MyLib.Properties.Settings.Default["ConnectionStringMyApp"] = connString;
Das funktioniert, wenn man weiß, dass die Properties in den Settings problemlos über Default[] beschrieben werden können.