2012-10-25 53 views
2

我有以下JScript代碼:ADODB命令未能與參數化的SQL查詢執行

var conn = new ActiveXObject ("ADODB.Connection"); 
conn.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=blah_blah_blah;User=foo;Password=bar;"); 
var cmd = new ActiveXObject("ADODB.Command"); 
cmd.ActiveConnection = conn; 

var strSQL = "SELECT id FROM tbl_info WHERE title LIKE :search ORDER BY id"; 
var search = "test"; 

try{ 
    cmd.CommandText = strSQL; 
    var param = cmd.CreateParameter(':search', 200, 1, 100, search); 
    cmd.Parameters.Append(param); 
    var rs = cmd.Execute(); 
    } 
catch (ex) { 
    Application.Alert("Error retrieving id information from database."); 
} 

我已經驗證(通過打印它們)連接對象被設置爲命令的ActiveConnection,參數對象有正確的值和Command對象具有正確的SQL查詢作爲其CommandText。我還在try塊的每一行後面插入了一條alert語句,以查看錯誤發生的位置 - 在cmd.Parameters.Append後很好,但運行Execute語句時拋出異常。

我已經試過顯示實際例外,但它只是一個普通的「對象錯誤」的消息。

查詢執行罰款,並返回正確的結果集時,我只是執行SQL查詢(不帶參數),直接通過Connection對象,但似乎當我使用參數化查詢與Command對象失敗。

至於我可以看到所有的設置和命令和連接對象的屬性是正確的,但不管是什麼原因它拋出一個異常。

任何幫助,這將不勝感激。

回答

2

使用ODBC和ADO,一般來說,問號?被用作佔位符參數。參數以它們附加到Parameters集合的順序綁定到命令中的佔位符。在你的榜樣,更換strSQL有:

var strSQL = "SELECT id FROM tbl_info WHERE title LIKE ? ORDER BY id"; 

,您仍然可以命名所創建的參數,但它會成爲唯一的目的是爲了能夠通過名字後來引用它(例如,用cmd.Parameters.Item(":search"))。

+0

這工作很好,謝謝。 不過,現在我有一個問題我也有使用多個參數等的查詢,但它們都使用_same_參數。所以我有一個參數(稱爲:搜索示例),它在同一個查詢中被多次引用。正如你所說的,因爲沒有足夠的綁定參數,所以它們按照它們追加到參數的順序被綁定,因爲查詢失敗。查詢是動態生成的,因此不可能確切知道需要多少個參數。有沒有辦法解決? – AdamLazaruso

+0

@AdamLazaruso,不是我所知道的。在之前類似的情況下,我在創建查詢時創建並附加了參數。 –

+0

這對我的代碼來說可能會很棘手,但如果沒有其他方法,我相信我可以使它工作。謝謝! – AdamLazaruso