2009-07-06 6 views
1

Y at-il de toute façon je peux exécuter la procédure stockée via EXEC (afin de ne pas spécifier CommandType.StoredProcedure en C#) et obtenir le résultat?Procédure d'appel par requête et stockée obtenir la valeur de retour en C#, sans paramètres de sortie

J'ai essayé d'exécuter la requête

DECLARE @R int 
EXEC @R = proc p1, p2 

puis de saisir @R mais sans succès.

Ce que je ne veux pas est de le faire de la manière habituelle en ajoutant des paramètres et en utilisant ParameterDirection.ReturnValue pour obtenir un résultat.

J'apprécierais n'importe quelle information. Ty.

EDIT

Certaines personnes ont demandé pourquoi.

J'ai besoin de créer un petit programme de console qui exécute n'importe quelle procédure stockée et obtient n'importe quel genre de résultat qu'il renvoie. L'application accepte le fichier .config avec la description de la base de données conn et le nom de sp.

Maintenant, si je le fais comme d'habitude, j'ai besoin entery config pour chaque paramètre ou si l'appel est spécifié dans le format de requête habituelle alors je dois l'analyser moi-même. L'utilisateur a besoin de connaître les détails des paramètres, etc ...

C'est pourquoi j'ai choisi l'approche exec. L'utilisateur peut spécifier dans la procédure stockée de fichier de configuration et les paramètres sous une clé.

<add key="Procedure" value="dbo.TEST 10,20"/> 

et ne pensez pas beaucoup à ce sujet. Les gens qui travaillent sur de tels programmes ne comprennent pas les choses de programmation, ils savent qu'ils doivent mettre du texte en arguments (ie la conversion implicite est mystère)

Le programme n'accepte généralement pas les paramètres de l'utilisateur, sauf la configuration inital et donc l'injection SQL. n'existe pas, et même si cela concerne le contrôle d'injection peut être déplacé au niveau SP.

La mise en œuvre ofc devient trivial:

const string runFormat = "exec ('declare @r varchar (1024);EXEC @r={0}{1};select @r')"; 

    public bool Run(string parameters, out string result) { 
     SqlConnection con = new SqlConnection(connectionString); 

     SqlCommand cmnd = new SqlCommand(String.Empty, con); 
     cmnd.CommandText = String.Format(runFormat, storedProcedure, parameters ?? String.Empty); 

     try { 
      con.Open(); 
      result = (string)cmnd.ExecuteScalar(); 
     } 
     catch (Exception e) { 
      result = e.Message; 
      return false; 
     } 
     return true; 
    }  
+1

Vous avez dit ce que vous ne voulez pas faire, mais pas ce que vous voulez faire. Qu'est-ce que vous essayez d'accomplir en n'utilisant pas de paramètres? –

+0

Consultez EDIT ci-dessus. – majkinetor

Répondre

3

essayer cette course cette requête en C#:

exec ('Déclare @r int; EXEC @ r = test 1,2, sélectionnez @r')

+0

Ty mate, exactement ce dont j'avais besoin. Je reçois des résultats avec l'exécution scalaire. – majkinetor

2

Vous ne pouvez pas mettre la main sur @R car il est déclaré dans un lot qui n'a pas connaissance d'un monde extérieur. BLToolkit de sauvetage (à peu près):

[SqlQuery("declare @r int; exec @r = proc @p1, @p2; return @r")] 
public abstract object ExecProc(int @p1, int @p2); 
Questions connexes