2012-08-02 108 views
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) 

不過,我需要做的是對本地有所不同的查詢。我怎麼能做到這一點,沒有字符串連接等最好的做法是什麼,我不想用問號準備查詢,我不喜歡用順序傳遞參數(它是必需的,帶有問號而沒有命名參數)並多次。任何幫助將不勝感激。

更新誤解:我正在尋找一個不依賴於數據庫的通用解決方案。

回答

6

您不能在OLE DB中使用具有即席查詢的命名參數。如果您使用的SQL Server,你可以做這樣的事情:

Dim sql 
sql = "" 
sql = sql & "DECLARE @param1 varchar(20) = ?;" 
sql = sql & "DECLARE @param2 varchar(20) = ?;" 
sql = sql & "Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1;" 

' This section is basically the same as in the original question 
Dim cmd 
Set cmd = Server.CreateObject("Adodb.Command") 
cmd.CommandType = adCmdText 
cmd.CommandText = sql 
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 

你仍然需要在位置綁定參數,但這樣一來,正確的順序是更容易看到,你可以使用相同的參數多個地點。

+0

對不起,我遲到了。首先,非常感謝你的配合。你給的技巧是巧妙的。但這對我來說還不夠。我只是想讓它變得更容易,但這並不像我預料的那樣容易。讓我解釋一下最後的狀態。我在MySQL服務器上。但是,MySQL ODBC驅動程序不支持像你所示的命令範圍的聲明,需要通過連接對象聲明爲會話變量。因此,請等待更好的解決方案。如果不是,這已經是可以接受的答案。祝你好運。 – remiremi 2012-10-06 23:58:42

+2

@remiremi,你的問題在多個地方明確提到SQL Server。如果你現在需要MySQL的答案,我會建議問一個新的問題。 – 2012-10-07 05:05:01

+2

由於SQL Server的Profiler功能,這是測試用例。我的問題完全與ADO有關。我正在尋找一個通用的解決方案,因爲我正在開發的應用程序應該與四個(sql server,mysql,sqlite,ms access)不同的數據庫類型兼容。所以恐怕我不會問一個新的問題。 – remiremi 2012-10-11 21:16:44

相關問題