2012-07-04 48 views
1

我想获得一个paramterised查询工作在asp经典。赞赏 这里任何帮助是错误参数化查询asp经典缺少操作数错误

的Microsoft OLE DB提供程序的Visual 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 

回答

2

使用参数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() 
+0

这是一个FoxPro特定的东西吗?我以前使用过其他数据库的'LIKE'子句的参数。 –

+0

@Cheran我很久以前就读过一些东西,它坚持了 - 我的不好。将相应地更新我的帖子。 –

0

您需要周围的%人物语录:

... +" and upper(name) like ? + '%' "+ ... 
+0

我认为它仍然无法正常工作,因为你必须通过'%'作为参数本身的一部分,但它不是完全错误像我以前所想的那样。我很抱歉。 –

0

好像VFP不支持命名参数,只需添加您的PARAMS中,在apears顺序通过使用(?)而不是命名参数进行查询,它将起作用。而不是

cmd.Parameters("@name") = code 

用途:

cmd.Parameters("?") = code