我在经典asp中创建记录集对象时遇到问题,我的记录集对象无法识别正确的结果数。
我的代码:
subProdQuery = "SELECT idProduct, idSupplier FROM products WHERE pcprod_ParentPrd="&prodID&";"
subRes = conn.execute(subProdQuery)
if subRes.BOF and subRes.EOF then
response.write subProdQuery&"<br>"&subRes("idProduct")&"LAST ENTRY<br>"
else
do until subRes.EOF
response.write subRes("idProduct")&"<br>"
subRes.MoveNext
loop
end if
set subRes = nothing
我得到的结果非常奇怪。如果我手动将生成的查询键入SQL管理工作室,我会得到至少5个结果。当通过asp生成结果时,subRes始终被识别为BOF和EOF。但是,在每种情况下打印subRes(“idProduct”)的结果是我期望的每个查询的第一个结果。有什么建议?提前谢谢!
答案 0 :(得分:2)
首先,防止SQL注入并使用带参数的ADODB.Command。至少,如果ProdID是int,请先验证它。
有时您需要调用MoveFirst来设置BOF / EOF标志。仅当您向前移动时,仅检查EOF就足够了。
on error resume next
Dim inttest
inttest = CLng(prodID)
if err.number > 0 then ... <<< do something about invalid inputs
on error goto 0
subProdQuery = "SELECT idProduct, idSupplier FROM products WHERE pcprod_ParentPrd=" & prodID
subRes = conn.execute(subProdQuery)
subRes.MoveFirst ' << add this
if subRes.EOF then
response.write subProdQuery&"<br>"&subRes("idProduct")&"LAST ENTRY<br>"
else
do until subRes.EOF
response.write subRes("idProduct")&"<br>"
subRes.MoveNext
loop
end if
set subRes = nothing
而不是ADOConnection.Execute,我通常使用ADOConnection.Open来提供更多选项。
Const adUseClient = 3
Const adCmdText = 1
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Dim subRes = Server.CreateObject("ADODB.Recordset")
subRes.Open subProdQuery, conn, adOpenForwardOnly, adLockReadOnly, adUseClient
答案 1 :(得分:1)
你必须使用set
。
set subRes = conn.execute(subProdQuery)