Zurückschreiben von Änderungen
Zu Abschnitt 5.4.2 des Buchs
Das folgende Beispiel zeigt, wie man Änderungen im DataSet in die
Datenbank zurückschreibt. Zuerst werden mit LoadData die Daten ausgelesen und das
DataSet aufgebaut. Danach werden mit der Methode ChangeData die Daten im DataSet
verändert. Danach werden mit der Methode StoreData die beiden Tabellen in die Datenbank
zurückgeschrieben. Durch neuerliches Laden und durch die Ausgabe wird gezeigt,
dass die Daten in der Datenbank wirklich verändert wurden.
5-4-2-DataAdapterUpdateSample.cs
using System;
using System.Data;
using System.Data.OleDb;
namespace Chapter5
{
class DataAdapterUpdateSample
{
static void Main(string[] args)
{
//----- Daten und Schema laden
DataSet ds = LoadData();
//----- Daten ausgeben
Print(ds);
//----- Daten aendern
ChangeData(ds);
// Tabelle Person speichern
StoreTable(ds, "Person");
// Tabelle Contact speichern
StoreTable(ds, "Contact");
//----- Daten ausgeben
Print(ds);
//----- Daten und Schema neu laden
ds = LoadData();
//----- Daten ausgeben
Print(ds);
}
static void Print(DataSet ds)
{
Console.WriteLine("DataSet {0}:", ds.DataSetName);
Console.WriteLine();
foreach (DataTable t in ds.Tables)
{
Print(t);
Console.WriteLine();
}
}
static void Print(DataTable t)
{
//---- Tabellenkopf
Console.WriteLine("Tabelle {0}:", t.TableName);
foreach (DataColumn col in t.Columns)
{
Console.Write(col.ColumnName + "|");
}
Console.WriteLine();
for (int i = 0; i < 40; i++) { Console.Write("-"); }
Console.WriteLine();
//---- Daten
int nrOfCols = t.Columns.Count;
foreach (DataRow row in t.Rows)
{
for (int i = 0; i < nrOfCols; i++)
{
Console.Write(row[i]); Console.Write("|");
}
Console.WriteLine();
}
}
static IDbCommand GetSelectAllCmd()
{
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = new OleDbConnection("provider=SQLOLEDB; " +
" data source=(local)\\SQLEXPRESS; database=NETBOOK; user id=sa; password=sa;");
cmd.CommandText = "SELECT * FROM Person; SELECT * FROM Contact";
return cmd;
}
static DataSet LoadData()
{
DataSet ds = new DataSet("PersonContacts");
IDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = GetSelectAllCmd();
//----- im DataSet befinden sich noch keine Tabellen, also fge sie bei Fill hinzu!
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
//----- Automatisch erzeugte Tabellen umbenennen
adapter.TableMappings.Add("Table", "Person");
adapter.TableMappings.Add("Table1", "Contact");
//----- Daten aus der Datenbank laden
adapter.Fill(ds);
if (ds.HasErrors) ds.RejectChanges(); else ds.AcceptChanges();
if (adapter is IDisposable) ((IDisposable)adapter).Dispose();
return ds;
}
// speichert die Datensaetze einer Tabelle
static void StoreTable(DataSet ds, string tableName)
{
OleDbConnection con = new OleDbConnection("provider=SQLOLEDB; " +
" data source=(local)\\SQLEXPRESS; database=NETBOOK; user id=sa; password=sa;");
//----- SelectCommand setzen, damit der OleDbCommandBuilder automatisch
// Insert-, Update- und Delete-Kommandos generieren kann
OleDbDataAdapter adapter =
new OleDbDataAdapter("SELECT * FROM " + tableName, con);
OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapter);
//----- Daten speichern!
try
{
adapter.Update(ds, tableName);
}
catch (DBConcurrencyException)
{
// Datenbank wurde auch von einer anderen Transaktion geaendert!
// ... Auf Fehler reagieren! z.B.: DataSet neu laden!
}
adapter.Dispose();
}
static void ChangeData(DataSet ds)
{
ds.Tables[0].Rows[0][1] = "Wolfgang";
ds.Tables[1].Rows[2][4] = "moessenboeck@ase.jku.at";
ds.Tables[1].Rows[3][4] = "praehofer@ase.jku.at";
}
}
}
|
Beim Ausführen des Programms wird folgende Ausgabe erzeugt:
|