Die anderen Antwort zeigt dies, aber im Wesentlichen brauchen Sie nur zu erstellen SqlParameter
, setzen Sie das Direction
zu Output
, und fügen Sie ihn in der SqlCommand
‚s Parameters
Sammlung. Führen Sie dann die gespeicherte Prozedur aus und erhalten Sie den Wert des Parameters.
Verwenden Sie Ihr Codebeispiel:
// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("sproc", conn))
{
// Create parameter with Direction as Output (and correct name and type)
SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
{
Direction = ParameterDirection.Output
};
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(outputIdParam);
conn.Open();
cmd.ExecuteNonQuery();
// Some various ways to grab the output depending on how you would like to
// handle a null value returned from the query (shown in comment for each).
// Note: You can use either the SqlParameter variable declared
// above or access it through the Parameters collection by name:
// outputIdParam.Value == cmd.Parameters["@ID"].Value
// Throws FormatException
int idFromString = int.Parse(outputIdParam.Value.ToString());
// Throws InvalidCastException
int idFromCast = (int)outputIdParam.Value;
// idAsNullableInt remains null
int? idAsNullableInt = outputIdParam.Value as int?;
// idOrDefaultValue is 0 (or any other value specified to the ?? operator)
int idOrDefaultValue = outputIdParam.Value as int? ?? default(int);
conn.Close();
}
Seien Sie vorsichtig, wenn Sie das bekommen Parameters[].Value
, da der Typ von dem gegossen werden muss, als object
was Sie ihn deklarieren. Und die SqlDbType
beim Erstellen verwendeten SqlParameter
Anforderungen müssen dem Typ in der Datenbank entsprechen. Wenn Sie es nur an die Konsole ausgeben Parameters["@Param"].Value.ToString()
möchten , verwenden Sie es möglicherweise nur (entweder explizit oder implizit über einen Console.Write()
oder einen String.Format()
Aufruf).
EDIT: Über 3,5 Jahre und fast 20.000 Aufrufe und niemand hatte sich die Mühe gemacht zu erwähnen, dass es nicht einmal aus dem Grund kompiliert wurde, der in meinem "Vorsicht" -Kommentar im ursprünglichen Beitrag angegeben ist. Nett. Es wurde behoben, basierend auf guten Kommentaren von @Walter Stabosz und @Stephen Kennedy und passend zum Update-Code in der Frage von @abatishchev.
conn.Close()
wie es in einemusing
Block istWenn Sie mit der gespeicherten Prozedur etwas Ähnliches mit einem Reader tun möchten, beachten Sie, dass der Reader geschlossen sein muss, um den Ausgabewert abzurufen.
quelle
Nicht mein Code, aber ein gutes Beispiel, denke ich
Quelle: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
quelle
Schriftart http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output
quelle
quelle
Sie können Ihr Ergebnis mit dem folgenden Code erhalten:
quelle
Erstellen Sie das SqlParamObject, mit dem Sie den Zugriff auf Methoden für die Parameter steuern können
::
Stellen Sie den Namen für Ihren Parameter ein (er sollte so sein, als hätten Sie eine Variable deklariert, die den Wert in Ihrer Datenbank enthält).
::
param.ParameterName = "@yourParamterName";
Deaktivieren Sie den Wertehalter, um Ihre Ausgabedaten zu speichern
::
param.Value = 0;
Stellen Sie die Richtung Ihrer Wahl ein (in Ihrem Fall sollte es Ausgabe sein)
::
param.Direction = System.Data.ParameterDirection.Output;
quelle
Das sieht für mich expliziter aus:
quelle