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.
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;
}
ExecuteScalar() fonctionnera, mais un paramètre de sortie serait une solution supérieure.
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;
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;
Vous pouvez essayer d'utiliser un paramètre de sortie. http://msdn.microsoft.com/en-us/library/ms378108.aspx
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;
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;
}
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;