是否有可能使用命名参数,当命令类型是为adCmdText?(Is it possible to us

2019-09-20 17:04发布

我试图使用命名参数通过Adodb.Command但没有运气下面的查询。

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)

不过,我需要做的是对本地有所不同的查询。 我该怎么办呢,什么是最好的做法做,没有字符串连接等。我不想与准备问号查询,我不喜欢传递参数与命令(这是neccesary带有问号的和没有命名参数)并多次。 任何帮助将不胜感激。

更新的误解:我正在寻找,不是取决于数据库是一个通用的解决方案。

Answer 1:

您不能使用在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

你仍然需要在位置绑定参数,但这样一来,正确的顺序是更容易看到,你可以使用在多个位置相同的参数。



文章来源: Is it possible to use named parameters when command type is adCmdText?