87 votes

C # appelant la procédure stockée SQL Server avec valeur de retour

Je suis en train d'appeler une procédure stockée à partir de mon application windows en C#. La procédure stockée est exécutée sur une instance locale de SQL Server 2008. Je suis en mesure d'appeler la procédure stockée, mais je ne suis pas en mesure de récupérer la valeur de retour de la procédure stockée. Cette procédure stockée est censé renvoyer le numéro suivant dans la séquence. J'ai fait des recherches en ligne et tous les sites que j'ai vu l'avons souligné à cette solution de travail.

Code de procédure stockée:

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 d'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 également essayé d'utiliser un DataSet pour récupérer la valeur de retour avec le même résultat. Ce qui me manque pour obtenir la valeur de retour de ma procédure stockée? Si plus d'information est nécessaire, s'il vous plaît laissez-moi savoir.

Merci

174voto

Alex Aza Points 29204

Vous devez ajouter un paramètre de retour à 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;
}
 

5voto

Gary Points 41

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" - sans utiliser de paramètres de sortie.

Vous pouvez effectuer les opérations suivantes - "@RETURN_VALUE" est ajouté en silence à chaque objet de commande. PAS BESOIN D'AJOUTER EXPLICITEMENT

     cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
 

3voto

Justin Dearing Points 4305

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

2voto

Aravind Points 1196

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

1voto

Dunc Points 4360

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X