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:
|