2008-09-17 12 views
5

Je ne trouve pas un moyen élégant d'obtenir la valeur de retour d'une procédure stockée lors de l'utilisation de TableAdapters.Comment faire pour récupérer les valeurs de retour de procédure stockée à partir d'un TableAdapter

Il semble que TableAdapter ne prenne pas en charge les valeurs de retour de procédure stockée SQL lors de l'utilisation d'un appel de procédure stockée non scalaire. Vous vous attendez à ce que la valeur de retour de la fonction générée automatiquement soit la valeur de retour de la procédure stockée, mais ce n'est pas le cas (c'est en fait le nombre de lignes affectées). Bien qu'il soit possible d'utiliser des paramètres 'out' et de passer une variable comme référence aux fonctions générées automatiquement, ce n'est pas une solution très propre.

J'ai vu quelques hacks laids sur le web pour résoudre ce problème, mais pas de solution décente. Toute aide serait appréciée.

+0

En effet, j'ai le même problème, il est ridicule que les valeurs de retour ne sont pas supportées, sans piratage – nicodemus13

Répondre

0

La fermeture de cette question à mesure qu'elle apparaît des valeurs de retour n'est pas prise en charge et il n'existe pas de solution de contournement élégante!

1

La façon d'obtenir la valeur de retour consiste à utiliser un paramètre SqlParameter sur l'objet SqlCommand dont la direction est définie sur ParameterDirection.ReturnValue. Vous devez vérifier la propriété SelectCommand du TableAdapter après avoir appelé Fill.

+0

La propriété SelectCommand est (AFAIK) privée au TableAdapter. Je devrais donc étendre chaque TableAdapter avec une classe partielle qui, à mon avis, n'est pas la solution élégante que j'espère trouver. –

0

Je ne peux pas dire avec certitude parce que je n'ai pas utilisé TableAdapters, mais vous pourriez avoir besoin de regarder votre procédure stockée et d'inclure les éléments suivants autour de votre procédure.

SET ROWCOUNT OFF 

BEGIN 
<Procedure Content> 
END 

SET ROWCOUNT ON 
+0

Merci pour la suggestion, mais malheureusement, le réglage du ROWCOUNT ne semble pas résoudre mon problème. –

1

NOTE: Le chemin à parcourir est d'utiliser un SqlParameter où la direction = ParameterDirection.ReturnValue

Cela dit, comme quelqu'un l'a déjà mentionné SqlParameters, voici une autre méthode dynamique à l'aide d'un DataSet. (Si c'est comment vous roulez):

Exemple instruction SQL et C# placé comme suit:

string sql = @"DECLARE @ret int 
      EXEC @ret = SP_DoStuff 'parm1', 'parm2' 
      SELECT @ret as ret"; 

DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here... 

int resultCode = -1; 
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode); 

Les résultats de la procédure stockée sont chargés dans un DataSet et aura autant DataTables que le retour des instructions select dans la procédure stockée .

Le dernier DataTable du DataSet aura 1 ligne et 1 colonne qui contiendra la valeur de retour de la procédure stockée.

1

En fait, tout ce que vous devez faire est de retourner votre valeur finale de la procédure stockée à l'aide d'une instruction SELECT, et non une instruction return. Le résultat du SELECT sera la valeur de retour. Par exemple, si vous faites simplement votre instruction de sortie sp "SELECT 1", vous obtiendrez un 1. Maintenant, sélectionnez simplement le scalaire réel que vous voulez renvoyer.

Questions connexes