3

当我在经典 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") 的结果是我期望每个查询的第一个结果。有什么建议么?提前致谢!

4

2 回答 2

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.Open而不是 ADOConnection.Execute,它允许更多选项。

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
于 2013-05-16T19:33:04.830 回答
1

你必须使用set.

set subRes = conn.execute(subProdQuery)

于 2013-05-17T06:35:33.930 回答