Appel de la procédure stockée avec une valeur de retour

J'essaie d'appeler une procédure stockée à partir de mon application c # windows. La procédure stockée s'exécute sur une instance locale de SQL Server 2008. Je suis capable d'appeler la procédure stockée mais je ne suis pas en mesure de récupérer la valeur de la procédure stockée. Cette procédure stockée est censée renvoyer le numéro suivant dans la séquence. J'ai fait des recherches en ligne et tous les sites que j'ai vus ont indiqué que cette solution fonctionnait.

Code de procédure stocké:

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

Le Code appel de la procédure stockée:

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();

J'ai aussi essayé d'utiliser un DataSet pour récupérer la valeur de retour avec le même résultat. Qu'est ce que je manque pour obtenir la valeur de retour de ma procédure stockée? Si vous avez besoin de plus d'informations, veuillez me le faire savoir.

58
demandé sur abatishchev 2011-06-02 07:22:12

8 réponses

Vous devez ajouter le paramètre return à la commande:

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;
}
108
répondu Alex Aza 2011-06-02 03:27:48

ExecuteScalar() fonctionnera, mais un paramètre de sortie serait une solution supérieure.

4
répondu Justin Dearing 2011-06-02 03:31:51

Je sais que c'est vieux, mais je suis tombé dessus avec Google.

Si vous avez une valeur de retour dans votre procédure stockée, dites "Return 1" - n'utilisant pas les paramètres de sortie.

Vous pouvez faire ce qui suit - "@RETURN_VALUE" est ajouté silencieusement à chaque objet de commande. PAS BESOIN D'AJOUTER EXPLICITEMENT

    cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
4
répondu Gary 2014-09-04 21:00:45

La version D'EnterpriseLibrary sur ma machine avait d'autres paramètres. Cela fonctionnait:

        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
répondu RaSor 2016-11-07 12:50:29

Vous pouvez essayer d'utiliser un paramètre de sortie. http://msdn.microsoft.com/en-us/library/ms378108.aspx

2
répondu Aravind 2011-06-02 03:29:28

J'ai eu un problème similaire avec L'appel SP renvoyant une erreur indiquant qu'un paramètre attendu n'était pas inclus. Mon code était le suivant.
Procédure Stockée:

@ Result INT OUTPUT

Et C#:

            SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32));
            result.Direction = ParameterDirection.ReturnValue;

Dans le dépannage, j'ai réalisé que la procédure stockée cherchait en fait une direction de "InputOutput", donc le changement suivant a résolu le problème.

            r

Résultat.Direction = ParameterDirection.Entrées-sorties;

2
répondu Paul 2017-05-09 17:22:45

Ou si vous utilisez EnterpriseLibrary plutôt que standard ADO.NET...

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
répondu Dunc 2014-01-22 11:11:15

Je vois que l'autre est fermé. Donc, fondamentalement, voici le rugueux de mon code. Je pense que vous manquez le commentaire de chaîne cmd. Par exemple, si ma procédure de magasin est appel:DBO.Test. Je devrais écrire cmd= " DBO.test". Ensuite, faites le type de commande égal à la procédure de stockage, et bla bla bla

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;
-6
répondu Rain 2014-11-21 05:22:54