it-swarm.com.de

Gespeicherte Prozedur mit Rückgabewert aufrufen

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.

63
Wesley

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;
}
118
Alex Aza

ExecuteScalar () wird funktionieren, aber ein Ausgabeparameter wäre eine überlegene Lösung.

4
Justin Dearing

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;
4
Gary

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;
3
RaSor

Sie können einen Ausgabeparameter verwenden. http://msdn.Microsoft.com/de-de/library/ms378108.aspx

2
Aravind

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;

2
Paul

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;
}
0
Dunc