Home   Cover Cover Cover Cover
 

Datenbankzugriff mittels DataAdapter


Zu Abschnitt 5.4.2 des Buchs

Dieses Beispiel zeigt, wie man mit einem DataAdapter ein DataSet befüllen kann. In der Methode LoadData werden die Tabellen Person und Contact der Datenbank NETBOOK mittels eines DataAdapters ausgelesen und mit diesen ein DataSet aufgebaut. Das DataSet wird als Ergebnis der Methode LoadData zurückgegeben. Danach wird das DataSet auf der Konsole ausgegeben.

In der Methode DefineRelation werden nun auch die in der Datenbank definierten Relationen ausgelesen und entsprechende Relationen im DataSet angelegt. Die Ausgabe zeigt, dass die Relation "Person_Contact" auch wirklich richtig arbeitet. Mit der Methode WriteXml wird schließlich das ganze DataSet in eine XML-Datei geschrieben.

5-4-2-DataAdapterSample.cs
using System;
using System.Data;
using System.Data.OleDb;

namespace Chapter5
{

    public class DataAdapterSample
    {

        public static void Main()
        {
            //----- Connection erzeugen
            OleDbConnection conn = new OleDbConnection("provider=SQLOLEDB; " +
                " data source=(local)\\SQLEXPRESS; database=NETBOOK;" +
                "user id=sa; password=sa;");

            //----- Daten und Schema laden
            DataSet ds = LoadData(conn);

            //----- Daten ausgeben
            Print(ds);

            //----- Relation aus Datenbank lesen und in DataSet definieren
            DefineRelation(ds, conn);

            //----- Relation verwenden um zu jeder Person die Kontakte auszugeben
            PrintContactsOfPersons(ds);

            //----- Daten als XML Datei speichern
            ds.WriteXml("data.xml");
        }

        static DataSet LoadData(OleDbConnection conn)
        {
            DataSet ds = new DataSet("PersonContacts");
            IDbDataAdapter adapter = new OleDbDataAdapter();
            //----- SELECT-Command erzeugen und setzen 
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = "SELECT * FROM Person; SELECT * FROM Contact";
            adapter.SelectCommand = cmd;
            //----- 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;
        }

        static void DefineRelation(DataSet ds, OleDbConnection conn)
        {
            DataTable schemaTable = null;
            //---- Fremdschluesselbeziehungen von Datenbank lesen
            try
            {
                if (conn.State != ConnectionState.Open) conn.Open();
                schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, null);
                conn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            //---- Referentielle Integritaet im DataSet erstellen
            if (schemaTable != null)
            {
                foreach (DataRow r in schemaTable.Rows)
                {
                    DataTable parentTab = ds.Tables[r["PK_TABLE_NAME"].ToString()];
                    DataTable childTab = ds.Tables[r["FK_TABLE_NAME"].ToString()];
                    DataRelation rel = new DataRelation(
                        //Name der Beziehung im DataSet
                        parentTab.TableName + "_" + childTab.TableName,
                        // Vatertabelle, Spalte des Primaerschluessels
                        parentTab.Columns[r["PK_COLUMN_NAME"].ToString()],
                        //Abhaengige Tabelle, Spalte des Fremdschluessels
                        childTab.Columns[r["FK_COLUMN_NAME"].ToString()]);
                    ds.Relations.Add(rel);
                }
            }
        }

        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 void PrintContactsOfPersons(DataSet ds)
        {
            Console.WriteLine("Kontakte von Personen:");
            Console.WriteLine("--------------------------------------"); 

            DataTable persons = ds.Tables["Person"];
            foreach (DataRow person in persons.Rows)
            {
                Console.WriteLine("Person: {0} {1}", person["FirstName"], person["Name"]);
                foreach (DataRow personContact in person.GetChildRows("Person_Contact")) {
                    Console.WriteLine("  Email: {0}, Phone {1}", personContact["EMail"], personContact["Phone"]);
                }
            }


        }

    }

}

Beim Ausführen des Programms wird folgende Ausgabe erzeugt:

output