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 Management Studio に入力すると、それぞれに対して少なくとも 5 つの結果が得られます。asp を介して結果を生成する場合、subRes は常に BOF と EOF の両方として認識されます。ただし、それぞれの場合に subRes("idProduct") を出力した結果は、各クエリで期待される最初の結果です。助言がありますか?前もって感謝します!

4

2 に答える 2

2

まず、SQL インジェクションから保護し、パラメーターを指定して ADODB.Command を使用します。少なくとも、ProdID が int の場合は、最初に検証してください。

BOF/EOF フラグを設定するために MoveFirst を呼び出す必要がある場合があります。前方に移動する場合のみ、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
于 2013-05-16T19:33:04.830 に答える