ExecuteNonQuery

1. Methodenbeschreibung

SqlCommand.ExecuteNonQuery()


Einsatzbereiche: INSERT (Einfügen), UPDATE (Aktualisieren), DELETE (Löschen). Nicht für SELECT‑Abfragen verwenden
Rückgabewert: Der Typ int gibt die Anzahl der von der SQL‑Anweisung betroffenen Datensätze an

Hintergrund: Bei der Ausführung von DML‑Anweisungen gibt die Datenbank die Anzahl geänderter Zeilen zurück. Das Programm nutzt diesen Wert, um zu prüfen, ob die Operation erfolgreich ausgeführt wurde.

Geschäftslogik anhand des Rückgabewertes

  1. INSERT: Erfolgreiches Einfügen → gibt 1 zurück; bei Fehlern wird eine Ausnahme ausgelöst;
  2. UPDATE:
  • Passende Datensätze gefunden und bearbeitet → Rückgabewert ≥1
  • Keine Datensätze zur WHERE‑Bedingung gefunden → gibt 0 zurück (Anweisung läuft ohne Fehler, aber keine Zeile wurde aktualisiert)
  1. DELETE:
  • Passende Datensätze gelöscht → Rückgabewert ≥1
  • Keine passenden Datensätze vorhanden → gibt 0 zurück

Wichtiger Hinweis: Rückgabewert 0 ist kein Programmfehler. Die SQL‑Syntax wird fehlerfrei ausgeführt, es wurden nur keine passenden Datensätze verändert.

Beispiel für INSERT‑Einfügung

private void button2_Click(object sender, EventArgs e)
{
    string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=True";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        SqlCommand sqlCom = new SqlCommand();
        sqlCom.Connection = conn;
        // Parametrisiertes SQL zum Schutz vor SQL‑Injection
        sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title]) VALUES(@Title)";
        sqlCom.CommandTimeout = 60;

        SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
        param.Value = "Das ist ein neuer Titel" + DateTime.Now;
        param.Direction = ParameterDirection.Input;
        sqlCom.Parameters.Add(param);

        int res = sqlCom.ExecuteNonQuery();
        MessageBox.Show(res.ToString()); 
        // Bei erfolgreicher Einfügung ist res=1
    }
}Code-Sprache: JavaScript (javascript)

Vorteil: Parametrisierte Abfragen verhindern Sicherheitslücken durch SQL‑Injection bei String‑Verkettungen.

Beispiel für UPDATE‑Aktualisierung

conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "UPDATE [dbo].[Article] SET [Title] = @Title WHERE id = @id";
sqlCom.CommandTimeout = 60;

SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "Das ist ein neuer Titel"+DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);

// Zwei gleichwertige Varianten zum Hinzufügen von Parametern
//Variante 1: Objekt erstellen und danach hinzufügen
SqlParameter param2 = new SqlParameter("@id", SqlDbType.Int);
param2.Value = 5;
sqlCom.Parameters.Add(param2);

//Variante 2: Direkte verkettete Initialisierung (auskommentierte Schreibweise)
//sqlCom.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=5});

int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());Code-Sprache: JavaScript (javascript)
  • Datensatz mit id=5 existiert in der Tabelle → res=1
  • Datensatz mit id=5 nicht vorhanden → res=0
    So kann man es in der Geschäftslogik auswerten:
if(res > 0)
{
    MessageBox.Show("Aktualisierung erfolgreich");
}
else
{
    MessageBox.Show("Kein passender Datensatz gefunden, keine Aktualisierung durchgeführt");
}Code-Sprache: JavaScript (javascript)

Erläuterungen

  1. Erfolg nicht nur anhand fehlender Ausnahmen beurteilen
    Ein fehlerfreier SQL‑Aufruf bedeutet nicht, dass Daten geändert wurden. Zum Beispiel gibt es Rückgabewert 0, wenn keine Zeile zur Update‑Bedingung passt. Man muss immer die Anzahl betroffener Zeilen auswerten.
  2. ExecuteNonQuery nicht für SELECT‑Anweisungen nutzen
    Bei SELECT‑Aufrufen gibt die Methode nur -1 zurück und liefert keine Abfrageergebnisse. Zum Auslesen von Daten verwende ExecuteReader() / ExecuteScalar().
  3. Vorteil der using‑Syntax
    using(SqlConnection conn) gibt die Datenbankverbindung nach Abschluss automatisch frei und vermeidet Verbindungslecks.
  4. Parameternamen müssen exakt übereinstimmen
    Die Bezeichnungen @Title und @id im SQL‑Befehl müssen genau mit den Parameternamen von SqlParameter übereinstimmen. Groß‑/Kleinschreibung spielt keine Rolle, aber der Name darf nicht abweichen.

Vergleich der drei SqlCommand‑Methoden

MethodeVerwendungszweckRückgabewert
ExecuteNonQueryEinfügen / Ändern / Löschen (INSERT/UPDATE/DELETE)int Anzahl betroffener Zeilen
ExecuteScalarAbfrage einer einzelnen Zeile und Spalte (z. B. COUNT, Auslesen von Auto‑Increment‑IDs)object Wert der ersten Zeile, ersten Spalte
ExecuteReaderSELECT‑Abfrage mit mehreren Zeilen und SpaltenSqlDataReader Datenstrom

ExecuteNonQuery

Schreibe einen Kommentar

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