我正在尝试让参数化的查询在asp classic中工作。任何帮助表示赞赏这是错误
Microsoft OLE DB 提供程序的视觉 FoxPro 错误"80040e14" 缺少操作数。 /portal/jobportal/getaddress1.asp, 第 141 行
function paramQuery()
code = ucase(request.querystring("code"))
stype = request.querystring("type")
cAddressType = request.querystring("caddresstype")
Set rs = Server.CreateObject("ADODB.recordset")
Set cmd = server.CreateObject("ADODB.Command")
If IsObject(Session("portal_conn")) Then
Set conn = Session("portal_conn")
Else
Set conn = Server.CreateObject("ADODB.Connection")
cConnString = "Provider=vfpoledb;Data Source="+session("portaldata")+"portal.dbc"
conn.open cConnString,"",""
Set Session("portal_conn") = conn
end if
cmd.ActiveConnection = conn
cmd.Prepared = true
cmd.CommandType = 1
cmd.CommandText = "SELECT * from uaddress where userid = "+cstr(session("userid"))+" and upper(name) like ? + % "+" and type = '"+ trim(cAddresstype)+"' order by add1"
set param1 = cmd.CreateParameter("@name",200,2,40)
cmd.Parameters.append param1
cmd.Parameters("@name") = code
cmd.Execute() <-- missing operand error
rs.Open cmd
end function
将参数用于 SQL like
子句时,需要将%
作为参数值的一部分传递。
此外,为了防止SQL注入攻击,您最好也对其他值使用参数:
cmd.CommandText = "SELECT * FROM uaddress WHERE userid=? AND UPPER(name) LIKE ? AND type=? ORDER BY add1"
set param1 = cmd.CreateParameter("@id", 200, 2, 40)
cmd.Parameters.append param1
cmd.Parameters("@id") = cstr(session("userid"))
set param2 = cmd.CreateParameter("@name", 200, 2, 40)
cmd.Parameters.append param2
cmd.Parameters("@name") = "%" & code & "%"
set param3 = cmd.CreateParameter("@type", 200, 2, 40)
cmd.Parameters.append param3
cmd.Parameters("@type") = trim(cAddresstype)
cmd.Execute()
您需要
在%
字符两边加上引号:
... +" and upper(name) like ? + '%' "+ ...
似乎 VFP 不支持命名参数,只需使用 (?) 而不是命名参数按照查询中出现的顺序添加参数,它就会起作用。
而不是:
cmd.Parameters("@name") = code
用:
cmd.Parameters("?") = code