2011-10-03 171 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参数。 –

相关问题