2013-05-16 6 views
3

У меня возникла проблема, когда я создаю объект набора записей в классическом asp, где мой объект набора записей не распознает правильное количество результатов.Отсутствующие результаты из Recordset

Мой код:

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

Я думаю, что проблема в состоянии «если». Когда вы используете BOF или EOF в состоянии, вы вызываете условие BOF или EOF. Попробуйте сделать тест. Удалите условие if и просто выполните цикл EOF. Я знаю, если это необходимо, но попытайтесь это сделать. –

+0

Он зацикливается на тайм-аут, тот же «idProduct» генерируется больше, чем я могу подсчитать – Ryan

+0

Каково значение MaxRecords и RecordCount в вашем объекте набора записей? – Sparky

ответ

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 
+0

Спасибо за ввод. Я сделал то, что вы предложили, и if все еще всегда нажимает (subRes.EOF всегда истинно), и только первый результат печатается, хотя тот же запрос генерирует 5 результатов на студии управления сервером. – Ryan

+0

Как насчет использования ADOConnection.Open? – RichardTheKiwi

+0

Те же результаты, что и выполнение – Ryan

Смежные вопросы