1
我想通過Adodb.Command通過以下查詢使用命名參數,但沒有運氣。
命令類型爲adCmdText時可以使用命名參數嗎?
Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1
我使用了類似的代碼。
Dim cmd
Set cmd = Server.CreateObject("Adodb.Command")
cmd.NamedParameters = True
cmd.CommandType = adCmdText
cmd.CommandText = "Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1"
cmd.Parameters.Append cmd.CreateParameter("@param1", adVarchar, adParamInput, 20, "some text 1")
cmd.Parameters.Append cmd.CreateParameter("@param2", adVarchar, adParamInput, 20, "some text 2")
Set cmd.ActiveConnection = cn
Dim rs
Set rs = cmd.Execute
問題是,這會導致RDBMS端發生錯誤。
Microsoft OLE DB Provider for SQL Server error '80040e14'
Must declare the scalar variable "@param1".
如果查詢是存儲過程調用沒有任何問題。所以,我猜namedparameters隻影響調用存儲過程的命令對象。 當我使用SQL Server Profiler跟蹤查詢時,我看到只有以下查詢運行(請注意,沒有參數聲明,沒有賦值)。
SQL:BatchStarting Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)
SQL:BatchCompleted Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)
不過,我需要做的是對本地有所不同的查詢。我怎麼能做到這一點,沒有字符串連接等最好的做法是什麼,我不想用問號準備查詢,我不喜歡用順序傳遞參數(它是必需的,帶有問號而沒有命名參數)並多次。任何幫助將不勝感激。
更新誤解:我正在尋找一個不依賴於數據庫的通用解決方案。
對不起,我遲到了。首先,非常感謝你的配合。你給的技巧是巧妙的。但這對我來說還不夠。我只是想讓它變得更容易,但這並不像我預料的那樣容易。讓我解釋一下最後的狀態。我在MySQL服務器上。但是,MySQL ODBC驅動程序不支持像你所示的命令範圍的聲明,需要通過連接對象聲明爲會話變量。因此,請等待更好的解決方案。如果不是,這已經是可以接受的答案。祝你好運。 – remiremi 2012-10-06 23:58:42
@remiremi,你的問題在多個地方明確提到SQL Server。如果你現在需要MySQL的答案,我會建議問一個新的問題。 – 2012-10-07 05:05:01
由於SQL Server的Profiler功能,這是測試用例。我的問題完全與ADO有關。我正在尋找一個通用的解決方案,因爲我正在開發的應用程序應該與四個(sql server,mysql,sqlite,ms access)不同的數據庫類型兼容。所以恐怕我不會問一個新的問題。 – remiremi 2012-10-11 21:16:44