Gespeicherte Prozedur Return

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 @cout ist der Rückgabewert der gespeicherten Prozedur, er ist nicht mit dem Ausgabeparameter output gleichzusetzen.

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=@id verä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
  1. Der Parametername muss zwingend die feste Zeichenkette ReturnValue sein, eigene Namen sind nicht erlaubt
  2. Direction = ParameterDirection.ReturnValue
  3. Bei SQL‑Server‑Prozeduren kann return Wert ausschließlich Werte vom Typ int übermitteln
  4. Sie können den Parameterwert erst nach dem Aufruf von ExecuteNonQuery() auslesen

  • return‑Rückgabewert: Nur ein einziger Wert möglich, ausschließlich int‑Typ
  • output‑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

MethodeRückgabeinhaltEinsatzszenario
ExecuteReaderSqlDataReader (gestreamte mehrere Zeilen)Abfrage mehrerer Datensätze
SqlDataAdapter.FillDataSet/DataTable (Offline‑Tabelle)Tabellenbindung für WinForm‑Steuerelemente
ExecuteScalarobject (erste Spalte der ersten Zeile)Nur ein einzelnes Aggregatergebnis benötigt
ExecuteNonQueryint(betroffene Zeilen)+ReturnValue‑RückgabewertEinfügen / Aktualisieren / Löschen, wenn Statuscode aus Prozedur gebraucht wird

Gespeicherte Prozedur Return

Previous:

Schreibe einen Kommentar

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