2011-10-03 231 views
0

存儲過程,並使用ADO連接與然而引號,我遇到的問題..Microsoft OLE DB提供了SQL Server錯誤「80040E14」

x = "text'" 

    If instr(x,"'") then x=replace(x,"'","''") 

    'x = "text''" at this point 

    Set Rs = Server.Createobject("adodb.recordset") 
    Rs.Open "Select_SP @name='" & x & "'" 

我以爲我是這樣做的權利..但我想不會,因爲我得到這個錯誤:

Microsoft OLE DB Provider for SQL Server error '80040e14' 
    SELECT ID from Table where Name='text'' 

它不應該是

Name = 'text'''

爲什麼不是SQL RECO使用ADO操作雙引號?

的Select_SP用途是這樣的:

 SET @sql = 'SELECT ID from Table where Name='''[email protected]+'''' 
    Exec(@sql) 

難道我該SP正確寫入?

回答

1

簡而言之,不要像你這樣調用過程。改爲使用Command。這是從內存,因爲我沒有Windows系統中,此刻我的面前,但它應該工作:

Dim cmd 
Set cmd = Server.CreateObject("ADODB.Command") 
Set Cmd.ActiveConnection = myConnectionVariableHere 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "Select_SP" 

'Note: if the above two lines don't work, replace them with the following 
'cmd.CommandType = adCmdText 
'cmd.CommandText = "Select_CP @name=?" 

cmd.Parameters.Append cmd.CreateParameter("name", adVarChar, adParamInput, len(x), x) 
Rs.Open cmd 

現在,所有的說,我不能告訴你爲什麼你的程序是因爲你沒有向我們展示代碼。但我相當肯定,ADO不會將一對單引號轉換爲雙引號 - 不知道爲什麼你會這麼想。

看到OP的編輯後編輯。除非你絕對必須,否則不要以這種方式執行SQL。你只會給自己悲傷。我不知道你正在使用的數據庫和程序語法不很熟悉,但在Oracle中你可以寫這樣的:

PROCEDURE sql_test(MyName IN VARCHAR2, MyCursor OUT SYS_REFCURSOR) IS 
BEGIN 
    OPEN MyCursor FOR SELECT id FROM some_table WHERE name = MyName; 
END; 
+0

確定,但有另一種方式,通過使用IF SELECT語句切換.. THEN沒有把語句放在變量中,然後exec呢? MS Sql Server 2008的方式。 –

+0

你的意思是在程序裏面嗎?如果是這樣,我不確定,但這是一個不同的問題,你應該把它發佈到「sql-server」和「tsql」標籤下。我的答案解釋瞭如何將字符串從ADO傳遞到存儲過程,以及爲什麼引用會引起混淆,最好避免。 – Dan

+0

+1,這裏的關鍵是使用**參數**將變量傳遞給SQL Server。 Command對象是您如何使用ADO參數。 –

相關問題