Home   Cover Cover Cover Cover
 

Neue Datensätze hinzufügen


Zu Abschnitt 5.4.2 des Buchs

Das folgende Beispiel zeigt das Zurückschreiben von neuen Datensätzen in die Datenbank. Dabei wird für das Einfügen von neuen Datensätzen eine Datenbankprozedur InsertPerson verwendet. In der Methode StoreTable wird dazu beim DataAdapter ein entsprechendes INSERT-Kommandoobjekt gesetzt. Die Update- und Delete-Kommandos des DataAdapters werden automatisch erzeugt.

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

namespace Chapter
{
    class InsertContactsSample
    {
        static void Main(string[] args)
        {
            //----- Daten und Schema laden
            DataSet ds = LoadData();
            //----- Daten ausgeben
            Print(ds);

            //----- Daten aendern 
            AddPersonRow(ds.Tables[0], "Hermann", "Maier");
            AddPersonRow(ds.Tables[0], "Susanne", "Strasser");

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

            // Tabelle Person speichern
            StoreTable(ds, "Person");

            //----- 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 Person", con);
            //----- Setzen der Datenbankprozedur im InsertCommand
            adapter.InsertCommand = new OleDbCommand("InsertPerson");
            adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
            adapter.InsertCommand.Connection = con;
            //----- Parameter definieren und den Spalten der Person-Tabelle zuweisen
            OleDbParameterCollection parms = adapter.InsertCommand.Parameters;
            parms.Add ("@FirstName", OleDbType.VarWChar, 50, "FirstName");
            parms.Add ("@Name", OleDbType.VarWChar, 50, "Name");
            parms.Add ("@ID", OleDbType.BigInt, 8, "ID");
            parms["@ID"].Direction = ParameterDirection.Output;
            //----- Update- und Delete-Kommandos erzeugen
            OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapter);   
            //----- Kommandos ausfuehren und Daten speichern!
            try {  
                adapter.Update(ds, "Person");
            } catch (DBConcurrencyException) {} 
            adapter.Dispose();
        }

        static void AddPersonRow(DataTable table, string firstName, string name)
        {
            DataRow row = table.NewRow();
            row[1] = firstName; 
            row["Name"] = name;
            table.Rows.Add(row);
        }
    }

}

Beim Ausführen des Programms wird folgende Ausgabe erzeugt:

output