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
- INSERT: Erfolgreiches Einfügen → gibt
1zurück; bei Fehlern wird eine Ausnahme ausgelöst; - UPDATE:
- Passende Datensätze gefunden und bearbeitet → Rückgabewert ≥1
- Keine Datensätze zur
WHERE‑Bedingung gefunden → gibt0zurück (Anweisung läuft ohne Fehler, aber keine Zeile wurde aktualisiert)
- DELETE:
- Passende Datensätze gelöscht → Rückgabewert ≥1
- Keine passenden Datensätze vorhanden → gibt
0zurü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=5existiert in der Tabelle →res=1 - Datensatz mit
id=5nicht 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
- 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. ExecuteNonQuerynicht für SELECT‑Anweisungen nutzen
Bei SELECT‑Aufrufen gibt die Methode nur-1zurück und liefert keine Abfrageergebnisse. Zum Auslesen von Daten verwendeExecuteReader()/ExecuteScalar().- Vorteil der using‑Syntax
using(SqlConnection conn)gibt die Datenbankverbindung nach Abschluss automatisch frei und vermeidet Verbindungslecks. - Parameternamen müssen exakt übereinstimmen
Die Bezeichnungen@Titleund@idim SQL‑Befehl müssen genau mit den Parameternamen vonSqlParameterübereinstimmen. Groß‑/Kleinschreibung spielt keine Rolle, aber der Name darf nicht abweichen.
Vergleich der drei SqlCommand‑Methoden
| Methode | Verwendungszweck | Rückgabewert |
|---|---|---|
| ExecuteNonQuery | Einfügen / Ändern / Löschen (INSERT/UPDATE/DELETE) | int Anzahl betroffener Zeilen |
| ExecuteScalar | Abfrage einer einzelnen Zeile und Spalte (z. B. COUNT, Auslesen von Auto‑Increment‑IDs) | object Wert der ersten Zeile, ersten Spalte |
| ExecuteReader | SELECT‑Abfrage mit mehreren Zeilen und Spalten | SqlDataReader Datenstrom |
ExecuteNonQuery