C# ADO.NET‑DataSet befüllen durch Aufruf einer gespeicherten Prozedur mit SqlDataAdapter
Im vorherigen Abschnitt haben wir mit SqlDataReader eine vorwärtsgerichtete, lesegeschützte Stream‑Leseoperation ausgeführt. In diesem Teil setzen wir SqlDataAdapter ein, um Ergebnisse einer gespeicherten Prozedur komplett in ein DataSet (Offline‑Datentabelle im Arbeitsspeicher) zu laden. Das wird oft verwendet, um Steuerelemente wie DataGridView direkt zu binden.SqlCommand (gespeicherte Prozedur definieren) → SqlDataAdapter.SelectCommand → adapter.Fill(DataSet) holt die Daten automatisch ab
Beispiel
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "myProc";
// Festlegen, dass eine gespeicherte Prozedur ausgeführt wird
sqlCom.CommandType = CommandType.StoredProcedure;
// Eingabeparameter für die gespeicherte Prozedur übergeben
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// Daten‑Adapter
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = sqlCom;
DataSet ds = new DataSet();
// Daten laden, zweiter Parameter legt den Namen der internen Tabelle im DataSet fest
sqlDA.Fill(ds, "sdfdsf");
// WinForms‑Tabellensteuerelement binden
this.dataGridView1.DataSource = ds.Tables[0];
}Code-Sprache: C# (cs)
Saubereres Beispiel
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
string procName = "myProc";
using (SqlCommand sqlCom = new SqlCommand(procName, conn))
{
sqlCom.CommandType = CommandType.StoredProcedure;
// Kompakte Schreibweise für Parameter
sqlCom.Parameters.Add("@id", SqlDbType.Int).Value = 4;
SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom);
DataSet ds = new DataSet();
// Ergebnisse laden, Tabellenalias ArticleResult
sqlDA.Fill(ds, "ArticleResult");
// Steuerelement binden
dataGridView1.DataSource = ds.Tables["ArticleResult"];
// Alternativ Zugriff über Index: ds.Tables[0]
}
}Code-Sprache: JavaScript (javascript)
Erläuterung
Eigenschaften von SqlDataAdapter.Fill()
- Automatische Verbindungsteuerung: Ist die Verbindung beim Aufruf von
Fillnicht mit Open() geöffnet, öffnet der Adapter sie selbst und schließt sie nach Abschluss wieder;
Im Beispielcode wird
conn.Open()manuell aufgerufen. Das funktioniert, ist aber nicht zwingend nötig.
Fill(ds, "Tabellenname"): Gibt der im Speicher angelegten DataTable einen Namen für spätere Namenszugriffe. Fehlt die Angabe, lautet der StandardnameTable.- Gibt eine gespeicherte Prozedur mehrere Ergebnismengen zurück, erzeugt
Fillautomatisch mehrere DataTable‑Instanzen:ds.Tables[0]、ds.Tables[1]...
Kernvergleich: DataSet gegenüber SqlDataReader
| Objekt | Modus | Verbindungsauslastung | Einsatzfälle |
|---|---|---|---|
| SqlDataReader | Verbundener Stream‑Lesevorgang | Behält die Datenbankverbindung offen | Große Datenmengen, keine vollständige Zwischenspeicherung, zeilenweise Verarbeitung |
| DataSet(DataAdapter) | Offline‑Speichercache | Gibt die Verbindung direkt nach Fill frei | Bindung von UI‑Steuerelementen, kleine Datensätze, wiederholtes Auslesen |
Erforderliche Einstellung für gespeicherte Prozeduren
sqlCom.CommandType = CommandType.StoredProcedure;
Fehlt diese Zeile, behandelt ADO.NET myProc als normalen SQL‑Text und wirft direkt einen Fehler.
Steuerelement‑Bindung
dataGridView1.DataSource = ds.Tables[0];
Das WinForms‑Steuerelement DataGridView unterstützt die direkte Bindung an DataTable und erstellt Spalten automatisch.
Wenn Sie geänderte Daten später zurück in die Datenbank schreiben wollen, können Sie mit SqlDataAdapter.Update() Massenaktualisierungen durchführen.
Ohne manuelles Öffnen der Verbindung
using(SqlConnection conn=new SqlConnection(connectionString))
using(SqlCommand cmd=new SqlCommand("myProc",conn))
{
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@id",SqlDbType.Int).Value=4;
SqlDataAdapter da=new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds,"Article"); // Verbindung automatisch öffnen und schließen
}Code-Sprache: JavaScript (javascript)
Dieses Beispiel nutzt using‑Anweisungen für die Verbindung
SqlDataAdapter