Home   Cover Cover Cover Cover
 

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:

output