Appel de procédure stockée avec valeur de return

J'essaie d'appeler une procédure stockée à partir de mon application Windows C #. La procédure stockée s'exécute 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 la procédure stockée. Cette procédure stockée est supposée renvoyer le numéro suivant dans la séquence. J'ai fait des searchs en ligne et tous les sites que j'ai vus ont montré que cette solution fonctionnait.

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 

Code appelant la procédure stockée:

 SqlConnection conn = new SqlConnection(getConnectionSsortingng()); 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 return avec le même résultat. Qu'est-ce qui me manque pour get la valeur de return de ma procédure stockée? Si plus d'informations sont nécessaires, s'il vous plaît faites le moi savoir.

Vous devez append un paramètre de return à la command:

 using (SqlConnection conn = new SqlConnection(getConnectionSsortingng())) 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; } 

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

Si vous avez une valeur de return dans votre procédure stockée, dites "Return 1" – n'utilisant pas les parameters de sortie.

Vous pouvez faire ce qui suit – "@RETURN_VALUE" est ajouté silencieusement à chaque object de command. PAS BESOIN D'AJOUTER EXPLICITEMENT

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

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

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

La version de EnterpriseLibrary sur ma machine avait d'autres parameters. 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; 

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.Ssortingng, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; } 

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

@Result int SORTIE

Et C#:

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

En dépannage, j'ai réalisé que la procédure stockée cherchait réellement une direction de "InputOutput" donc la modification suivante a résolu le problème.

  r 

Result.Direction = ParameterDirection.InputOutput;

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

 Connection.open(); Ssortingng cmd="DBO.test"; //the command Sqlcommand mycommand;