Dieser Abschnitt zeigt den Aufruf von gespeicherten Prozeduren über ADO.NET: Mit ExecuteNonQuery ermitteln wir die Anzahl betroffener Zeilen und lesen gleichzeitig den Return‑Rückgabewert der Prozedur aus.
1. Definition der gespeicherten Datenbank‑Prozedur
create procedure mynewproc(@id int)
as
begin
declare @cout int
-- Update‑Anweisung
update Article set title = '111' where id = @id
-- Zähle Datensätze mit id größer als übergebener Parameter
select @cout = count(1) from Article where id > @id
-- return gibt Zahlenwert zurück (bei SQL‑Server‑Prozeduren ist nur int erlaubt)
return @cout
endCode-Sprache: PHP (php)
Wichtig:
return @coutist der Rückgabewert der gespeicherten Prozedur, er ist nicht mit dem Ausgabeparameteroutputgleichzusetzen.
2. Aufruf innerhalb von C#
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("mynewproc", connection);
command.CommandType = CommandType.StoredProcedure;
// 【Wichtig】Parameter für Return‑Wert registrieren, fester Name: ReturnValue
SqlParameter para = new SqlParameter(
"ReturnValue",
SqlDbType.Int,
4,
ParameterDirection.ReturnValue,
false,0,0,string.Empty,DataRowVersion.Default,null);
command.Parameters.Add(para);
// Eingabeparameter der gespeicherten Prozedur @id
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
command.Parameters.Add(param);
// ExecuteNonQuery: führt Einfügen‑Ändern‑Löschen aus, liefert 【betroffene Zeilen des Updates】
int rowsAffected = command.ExecuteNonQuery();
// Den von der Prozedur per return übergebenen Wert auslesen
int result = (int)command.Parameters["ReturnValue"].Value;
}Code-Sprache: PHP (php)
Empfohlene Schreibweise
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
// Rückgabeparameter anmelden (Name fest: ReturnValue, Richtung muss ReturnValue sein)
cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
// Eingabeparameter
cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;
// rowsAffected = Anzahl der durch Update geänderten Datensätze
int rowsAffected = cmd.ExecuteNonQuery();
// Wert von return @cout aus der gespeicherten Prozedur holen
int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Code-Sprache: JavaScript (javascript)
Hinweise
1. int rowsAffected = command.ExecuteNonQuery();
- Bedeutung: Anzahl der von DML‑Anweisungen (update/delete/insert) betroffenen Zeilen
- In diesem Beispiel: Anzahl der Treffer‑Datensätze, die durch
update Article set title='111' where id=@idverändert wurden - Nicht der Rückgabewert aus dem Prozedur‑return! Beide Werte sind komplett unabhängig voneinander
2. Der Parameter ReturnValue für Rückgabewerte
- Der Parametername muss zwingend die feste Zeichenkette
ReturnValuesein, eigene Namen sind nicht erlaubt Direction = ParameterDirection.ReturnValue- Bei SQL‑Server‑Prozeduren kann
return Wertausschließlich Werte vom Typ int übermitteln - Sie können den Parameterwert erst nach dem Aufruf von
ExecuteNonQuery()auslesen
return‑Rückgabewert: Nur ein einziger Wert möglich, ausschließlich int‑Typoutput‑Ausgabeparameter: Mehrere Parameter möglich, unterstützt alle gängigen Datentypen
Unterschiede
-- Innerhalb der gespeicherten Prozedur
update Article set title='111' where id=4; -- Annahme: ein Datensatz wird geändert
return 10; -- return‑RückgabewertCode-Sprache: PHP (php)
Nach der Ausführung:
rowsAffected = 1(vom Update betroffene Zeilen)procReturnVal = 10(der über return gelieferte Wert)
Zusammenfassung
| Methode | Rückgabeinhalt | Einsatzszenario |
|---|---|---|
| ExecuteReader | SqlDataReader (gestreamte mehrere Zeilen) | Abfrage mehrerer Datensätze |
| SqlDataAdapter.Fill | DataSet/DataTable (Offline‑Tabelle) | Tabellenbindung für WinForm‑Steuerelemente |
| ExecuteScalar | object (erste Spalte der ersten Zeile) | Nur ein einzelnes Aggregatergebnis benötigt |
| ExecuteNonQuery | int(betroffene Zeilen)+ReturnValue‑Rückgabewert | Einfügen / Aktualisieren / Löschen, wenn Statuscode aus Prozedur gebraucht wird |
Gespeicherte Prozedur Return
Previous: SqlDataAdapter