Ich versuche, eine gespeicherte Prozedur aus meiner C # Windows-Anwendung aufzurufen. Die gespeicherte Prozedur wird auf einer lokalen Instanz von SQL Server 2008 ausgeführt. Ich kann die gespeicherte Prozedur aufrufen, aber ich kann den Wert nicht von der gespeicherten Prozedur abrufen. Diese gespeicherte Prozedur soll die nächste Nummer in der Sequenz zurückgeben. Ich habe online recherchiert und alle Websites, die ich gesehen habe, haben gezeigt, dass diese Lösung funktioniert.
Code gespeicherter Prozeduren:
ALTER procedure [dbo].[usp_GetNewSeqVal]
@SeqName nvarchar(255)
as
begin
declare @NewSeqVal int
set NOCOUNT ON
update AllSequences
set @NewSeqVal = CurrVal = CurrVal+Incr
where SeqName = @SeqName
if @@rowcount = 0 begin
print 'Sequence does not exist'
return
end
return @NewSeqVal
end
Code, der die gespeicherte Prozedur aufruft:
SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();
SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter();
param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";
SqlDataReader reader = cmd.ExecuteReader();
Ich habe auch versucht, eine DataSet
zu verwenden, um den Rückgabewert mit demselben Ergebnis abzurufen. Was fehlt mir, um den Rückgabewert von meiner gespeicherten Prozedur zu erhalten? Wenn weitere Informationen benötigt werden, lass es mich wissen.
Sie müssen dem Befehl den Rückgabeparameter hinzufügen:
using (SqlConnection conn = new SqlConnection(getConnectionString()))
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = parameterStatement.getQuery();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("SeqName", "SeqNameValue");
var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
conn.Open();
cmd.ExecuteNonQuery();
var result = returnParameter.Value;
}
ExecuteScalar () wird funktionieren, aber ein Ausgabeparameter wäre eine überlegene Lösung.
Ich weiß, das ist alt, aber ich bin mit Google darüber gestolpert.
Wenn Sie in Ihrer gespeicherten Prozedur einen Rückgabewert haben, sagen Sie "Rückgabe 1" - keine Ausgabeparameter.
Sie können Folgendes tun: "@RETURN_VALUE" wird unbemerkt zu jedem Befehlsobjekt hinzugefügt. KEINE NOTWENDIGKEIT HINZUGEBEN
cmd.ExecuteNonQuery();
rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
Die Version von EnterpriseLibrary auf meinem Computer wies andere Parameter auf.
SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int);
retval.Direction = System.Data.ParameterDirection.ReturnValue;
cmd.Parameters.Add(retval);
db.ExecuteNonQuery(cmd);
object o = cmd.Parameters["@ReturnValue"].Value;
Sie können einen Ausgabeparameter verwenden. http://msdn.Microsoft.com/de-de/library/ms378108.aspx
Ich hatte ein ähnliches Problem mit dem Aufruf von SP, der einen Fehler zurückgab, dass ein erwarteter Parameter nicht enthalten war. Mein Code war wie folgt .
Gespeicherte Prozedur:
@Ergebnis in OUTPUT
Und C#:
SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue;
Bei der Problembehandlung stellte ich fest, dass die gespeicherte Prozedur tatsächlich nach einer Richtung von "InputOutput" suchte. Die folgende Änderung behebte das Problem.
r
Result.Direction = ParameterDirection.InputOutput;
Oder wenn Sie EnterpriseLibrary anstelle von ADO.NET verwenden ...
Database db = DatabaseFactory.CreateDatabase();
using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal"))
{
db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue");
db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null);
db.ExecuteNonQuery(cmd);
var result = (int)cmd.Parameters["RetVal"].Value;
}