Home   Cover Cover Cover Cover
 

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"]);
                }
            }

        }
    }
}