|
|
Erzeugen und Verwenden von DataSets
Zu Abschnitt 5.4.1 des Buchs
Das folgende Programm zeigt den Aufbau und die Verwendung von DataSets.
Es wird ein DataSet mit zwei Tabellen Person und Contact mit ähnlicher
Struktur wie die Datenbank NETBOOK aufgebaut, Daten eingefügt, bestimmte Datensätze gesucht
und ausgegeben. Danach wird eine DataView auf die Tabelle Person mit allen
Personen, deren Namen mit "W" beginnen, erzeugt und die entsprechenden Einträge
in der Tabelle Contact gelöscht. Die neuerliche Ausgabe zeigt, dass die Datensätze wirklich
gelöscht wurden.
Folgende Methoden werden verwendet:
CreateDataSet : erzeugt ein DataSet mit zwei DataTables Person und Contact .
DefineRelation : legt die Relation zwischen Person-Tabelle und Contact-Tabelle an
AddData : Fügt Datensätze ins DataSet ein.
DeleteDataView : erzeugt eine DataView auf die Person -Tabelle und löscht entsprechende Datensätze in
der Contact -Tabelle.
5-4-1-DataSetSample.cs
using System;
using System.Data;
namespace Chapter5
{
class DataSetSample
{
static DataSet CreateDataSet() {
DataSet ds = new DataSet("PersonContacts");
DataTable userTable = new DataTable("Person");
//----- erzeuge die Spalte ID, die auch Schluessel ist
DataColumn col = new DataColumn();
col.DataType = typeof(System.Int64);
col.ColumnName = "ID";
col.ReadOnly = true; // nur lesender Zugriff
col.Unique = true; // nur eindeutige Werte
col.AutoIncrement = true; // Schluesselwert wird automatisch vergeben
col.AutoIncrementSeed = -1; // erster autom. vergebene Schluesselwert beginnt bei -1
col.AutoIncrementStep = -1; // autom. Schluesselwert wird immer um eins reduziert
//----- fuege die Spalte zur Tabelle hinzu und definiere sie als Schluesselspalte
userTable.Columns.Add(col);
userTable.PrimaryKey = new DataColumn[] { col };
//----- erzeuge die Spalte FirstName und fuege sie zur Tabelle hinzu
col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "FirstName";
userTable.Columns.Add(col);
//----- erzeuge die Spalte Name und fuege sie zur Tabelle hinzu
col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "Name";
userTable.Columns.Add(col);
//----- fuege die Tabelle zum DataSet hinzu
ds.Tables.Add(userTable);
//----- Tabelle Contact erzeugen
userTable = new DataTable("Contact");
//----- Spalte ID
col = new DataColumn();
col.DataType = typeof(System.Int64);
col.ColumnName = "ID";
col.ReadOnly = true; // nur lesender Zugriff
col.Unique = true; // nur eindeutige Werte
col.AutoIncrement = true; // Schluesselwert wird automatisch vergeben
col.AutoIncrementSeed = -1; // erster autom. vergebene Schluesselwert beginnt bei -1
col.AutoIncrementStep = -1;
userTable.Columns.Add(col);
userTable.PrimaryKey = new DataColumn[] { col };
//----- Spalten: ID, FirstName, Name, NickName, EMail, Phone, PersonID
//----- erzeuge Spalte FirstName und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (string);
col.ColumnName = "FirstName";
userTable.Columns.Add (col);
//----- erzeuge Spalte Name und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (string);
col.ColumnName = "Name";
userTable.Columns.Add (col);
//----- erzeuge Spalte NickName und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (string);
col.ColumnName = "NickName";
userTable.Columns.Add (col);
//----- erzeuge Spalte EMail und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (string);
col.ColumnName = "EMail";
userTable.Columns.Add (col);
//----- erzeuge Spalte Phone und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (string);
col.ColumnName = "Phone";
userTable.Columns.Add (col);
//----- erzeuge Spalte PersonID und fuege sie zur Tabelle hinzu
col = new DataColumn ();
col.DataType = typeof (long);
col.ColumnName = "PersonID";
userTable.Columns.Add (col);
//----- fuege die Tabelle zum DataSet hinzu
ds.Tables.Add(userTable);
return ds;
}
static void DefineRelation(DataSet ds) {
DataColumn parentCol = ds.Tables["Person"].Columns["ID"];
DataColumn childCol = ds.Tables["Contact"].Columns["PersonID"];
DataRelation rel = new DataRelation("PersonHasContacts", parentCol, childCol);
ds.Relations.Add(rel);
}
static void AddData(DataSet ds) {
//----- Person Daten hinzufuegen
DataTable table = ds.Tables["Person"];
//----- ersten Datensatz einfuegen
DataRow row = table.NewRow(); // hat 3 Spalten; Spalte 0 (ID) wird automatisch vergeben
row[1] = "Albrecht"; // Spalte 1: "FirstName"
row["Name"] = "Woess"; // Spalte 2: "Name"
table.Rows.Add(row);
//----- zweiten Datensatz einfuegen
table.Rows.Add(new object[] {null,"Dietrich", "Birngruber"});
System.Console.WriteLine ("Neue IDs {0} {1} ", row[0], table.Rows[1]["ID"]);
ds.AcceptChanges(); // entspricht dem Commit einer Transaktion
//----- Contact Daten hinzufuegen
long userID = (long)row[0];
table = ds.Tables["Contact"];
row = table.NewRow ();
//----- ID, FirstName, Name, NickName, Phone, PersonID
row[1] = "Albrecht";
row[2] = "Woess";
row[3] = "Gogo";
row[4] = "gogo@dotnet.jku.at";
row[5] = "7134";
row[6] = userID;
table.Rows.Add (row);
ds.AcceptChanges(); // entspricht dem Commit einer Transaktion
}
static void DeleteDataView(DataSet ds)
{
DataView view = new DataView(ds.Tables["Person"]); // oder Tables["Person"].DefaultView
//----- suche alle Personen, deren Name mit 'W' beginnt
view.RowFilter = "Name LIKE 'W*'"; // Strings muessen in '' stehen
foreach (DataRowView person in view)
{
//----- loesche alle Kontakte der gefundenen Personen
foreach (DataRow contact in person.Row.GetChildRows("PersonHasContacts"))
contact.Delete();
}
ds.AcceptChanges(); // alle Aenderungen werden uebernommen
}
public static void Main()
{
//----- Schema erzeugen
DataSet ds = CreateDataSet();
DefineRelation(ds);
//----- Daten hinzufuegen
AddData(ds);
//----- Person mit bestimmtem Primaerschluessel suchen
DataRow person = ds.Tables["Person"].Rows.Find(-1); //Suche nach Person mit ID=-1
if (person != null) {
Console.WriteLine("Kontakte von {0}:", person["Name"]);
//----- alle Kontakte der gefundenen Person ausgeben
foreach (DataRow contact in person.GetChildRows("PersonHasContacts")) {
Console.WriteLine("{0}, {1}: {2}", contact[0], contact["Name"], contact["Phone"]);
}
}
//----- DataView erzeugen und Sicht darauf generieren
DeleteDataView(ds);
//----- Person mit bestimmtem Primaerschluessel suchen
person = ds.Tables["Person"].Rows.Find(-1); //Suche nach Person mit ID=-1
if (person != null)
{
Console.WriteLine("Kontakte von {0}:", person["Name"]);
//----- alle Kontakte der gefundenen Person ausgeben
foreach (DataRow contact in person.GetChildRows("PersonHasContacts"))
{
Console.WriteLine("{0}, {1}: {2}", contact[0], contact["Name"], contact["Phone"]);
}
}
}
}
}
|
|