2010-08-17 3 views
0

У меня есть приложение, которое позволяет пользователю вводить строку SQL с заполнителем для определенных значений, создаваемых моим приложением. Приложение заменит заполнители значениями и выполнит строку SQL через различные базы данных.Выполнение хранимой процедуры через ODBC

Для бэкэнд ODBC я вызываю SQLExecDirect() на SQL-строке, который хорошо работает на регулярных запросах, но не работает для хранимых процедур с параметрами.

Есть ли простой способ расширить этот механизм для поддержки хранимых процедур? Определенный способ написания SQL?

Единственное, что я могу сейчас придумать, это начать разбор строки SQL и вызвать SQLBindParameter() n раз, если она связывает «вызов». Но разбор SQL сложный.

Любые идеи?

Рабочий SQL пример: SELECT Columna из обув где columnB = '% заполнителем'

Неработающий SQL: CALL StoredFoo ('% заполнителем')

+0

Звучит как ужасное приложение .. без обид. Я бы рекомендовал создать определенный интерфейс для хранимых процедур, если это требуется. Как вы доверяете своим пользователям писать хорошие, неразрушающие запросы? – Fosco

+0

Приложение установлено на ПК пользователя и как часть процесса настройки, он может помещать операторы SQL, где сохранять значения в свой файл конфигурации. Таким образом, нет никаких проблем с безопасностью, кроме как он может случайно перезаписать свои собственные данные. –

ответ

2

How to call stored procedures (ODBC):

Для запуска процедура в виде RPC

  1. Построить инструкцию SQL, использующую ODBC CALL escape seq uence. Оператор использует маркеры параметров для каждого входного, ввода/вывода, а также выходной параметр, и возвращаемое значение процедуры (если таковые имеются):

    {? = CALL procname (?,?)}

  2. вызовов SQLBindParameter для каждого входа, вход/выход и выход , а для процедуры возвращаемое значение (если есть).

  3. Выполните заявление с помощью SQLExecDirect.

В противном случае вам необходимо выполнить процедуру как обычная партия (а не вызов RPC), то есть. вам необходимо запустить партию:

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