2010-08-17 205 views
0

我有一個應用程序,允許用戶使用佔位符爲我的應用程序生成的某些值輸入SQL字符串。應用程序將用值替換佔位符,並通過各種數據庫後端執行SQL字符串。通過ODBC執行存儲過程

對於ODBC後端,我調用了SQLExecDirect(),它對常規查詢很好地工作,但對於帶有參數的存儲過程失敗。

是否有一種簡單的方法來擴展此機制以支持存儲過程? SQL必須如何編寫的某種方式?

我現在唯一能想到的就是開始解析SQL字符串,如果它包含「call」,則調用SQLBindParameter()n次。但解析SQL很棘手。

任何想法?

工作SQL例如:從FOO SELECT columnA其中columnB = '%佔位符'

非工作SQL:CALL StoredFoo( '%佔位符')

+0

聽起來像一個可怕的應用程序..沒有罪。我會建議存儲過程創建一個特定的接口,如果這是必需的功能。您如何相信您的用戶可以編寫出好的非破壞性查詢? – Fosco 2010-08-17 17:13:51

+0

該應用程序安裝在用戶的PC上,並且作爲配置過程的一部分,他可以將SQL語句的值保存到他的配置文件中。除了他可能意外覆蓋自己的數據之外,沒有任何安全問題。 – 2010-08-17 17:20:25

回答

2

How to call stored procedures (ODBC)

要運行作爲RPC的程序

  1. 構建使用ODBC CALL轉義序列的SQL語句uence。 該語句使用參數標記 對於每個輸入,輸入/輸出,和 輸出參數,以及用於 過程返回值(如果有的話):

    {? = CALL procname (?,?)}

  2. 呼叫的SQLBindParameter對於每個輸入,輸入/輸出,並輸出 參數,以及程序 返回值(如果有)。

  3. SQLExecDirect執行聲明。

否則,你需要執行的程序作爲一個普通批次(不是一個RPC調用),即。你需要運行批處理:

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