SqlDataAdapter

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.SelectCommandadapter.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()
  1. Automatische Verbindungsteuerung: Ist die Verbindung beim Aufruf von Fill nicht 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.

  1. Fill(ds, "Tabellenname"): Gibt der im Speicher angelegten DataTable einen Namen für spätere Namenszugriffe. Fehlt die Angabe, lautet der Standardname Table.
  2. Gibt eine gespeicherte Prozedur mehrere Ergebnismengen zurück, erzeugt Fill automatisch mehrere DataTable‑Instanzen: ds.Tables[0]、ds.Tables[1]...
Kernvergleich: DataSet gegenüber SqlDataReader
ObjektModusVerbindungsauslastungEinsatzfälle
SqlDataReaderVerbundener Stream‑LesevorgangBehält die Datenbankverbindung offenGroße Datenmengen, keine vollständige Zwischenspeicherung, zeilenweise Verarbeitung
DataSet(DataAdapter)Offline‑SpeichercacheGibt die Verbindung direkt nach Fill freiBindung 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert