2010-08-17 6 views
0

J'ai une application qui permet à l'utilisateur d'entrer une chaîne SQL avec un espace réservé pour certaines valeurs produites par mon application. L'application va remplacer les espaces réservés par des valeurs et exécuter la chaîne SQL à travers différents backends de base de données.Exécution d'une procédure stockée sur ODBC

Pour le backend ODBC, j'appelle SQLExecDirect() sur le SQL Strin qui fonctionne bien sur les requêtes régulières, mais échoue pour les procédures stockées avec des paramètres.

Existe-t-il un moyen simple d'étendre ce mécanisme pour prendre en charge les procédures stockées? D'une certaine manière comment le SQL doit être écrit? La seule chose à laquelle je peux penser en ce moment est de commencer à analyser la chaîne SQL et d'appeler n fois SQLBindParameter() si elle conatains un "appel". Mais l'analyse de SQL est délicate.

Des idées?

exemple de travail SQL: SELECT COLUMNA de foo où ColumnB = 'espace réservé%'

SQL non-travail: CALL StoredFoo ('espace réservé%')

+0

Sons comme une application terribles .. aucune infraction .. Je recommande la création d'une interface spécifique pour les procédures stockées, si cela est nécessaire fonctionnalité. Comment faites-vous confiance à vos utilisateurs pour écrire de bonnes requêtes non-destructives? – Fosco

+0

L'application est installée sur le PC de l'utilisateur et dans le cadre du processus de configuration, il peut mettre les instructions SQL où enregistrer les valeurs dans son fichier de configuration. Il n'y a donc pas de problème de sécurité à part qu'il peut accidentellement écraser ses propres données. –

Répondre

2

How to call stored procedures (ODBC):

Pour exécuter une procédure en tant que RPC

  1. Construire une instruction SQL qui utilise la séquence d'échappement ODBC CALL d'origine. L'instruction utilise des marqueurs de paramètres pour chaque entrée, entrée/sortie, et paramètre de sortie, et pour la valeur de retour de la procédure (le cas échéant):

    {? = CALL procname (?,?)}

  2. appel SQLBindParameter pour chaque entrée, d'entrée/sortie, et sortie paramètre, et pour la procédure valeur de retour (le cas échéant). Exécutez l'instruction avec SQLExecDirect.

Sinon, vous devez exécuter la procédure comme un lot ordinaire (et non un appel RPC), à savoir. vous devez exécuter le lot:

EXEC procname @param1, @param2, @param3...;