2012-07-04 46 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