2010-11-29 5 views
3

Недавно у меня был очень странный problem. Приложение написано в классическом ASP, но я думаю, что это тот же случай для каждого соединения, использующего ADO/OLEDB.ADODB странное поведение

Это параметры подключения.

conn=Server.CreateObject("ADODB.Connection"); 
conn.Provider="Microsoft.Jet.OLEDB.4.0"; 
conn.Open("D:/db/testingDb.mdb"); 

Короче этот код:

conn.Open("myconnection"); 
bigQuery = "..."; 
rs = conn.execute(bigQuery); 
while (!rs.eof) { 
    ... 
    smallQuery = "..." 
    rssmall = conn.execute(smallQuery); 
    ... 
    rssmall.close(); 
    ... 
    rs.movenext(); 
} 
rs.close(); 
conn.close(); 

Не работает, если BigQuery возвращает более чем определенное количество строк (в моем случае ~ 20). Но если я использую еще одно соединение для внутреннего контура, как stealthyninja предложил:

conn.Open("myconnection"); 
conn2.Open("myconnection") 

bigQuery = "..."; 
rs = conn.execute(bigQuery); 
while (!rs.eof) { 
    ... 
    smallQuery = "..." 
    rssmall = conn2.execute(smallQuery); 
    ... 
    rssmall.close(); 
    ... 
    rs.movenext(); 
} 
rs.close(); 
conn2.close(); 
conn.close(); 

проблема исчезает.

Я использую базу данных Access и IIS7, если это имеет значение.

У кого-нибудь есть логическое объяснение этого?

+2

Я не могу найти ничего об этом, но моя _guess_ будет заключаться в том, что вы не можете повторно использовать соединение, которое уже прикреплено к открытому набору записей. Почему он работает около 20 записей? Кэширование, наверное. Опять же, это все предположения; Я не смог найти ничего в методе Execute набора записей или объекте Connection, связанном с этой проблемой. – 2010-11-29 20:12:03

ответ

4

У комментария Майкла Тодда есть это. ADODB не поддерживает MARS (несколько активных наборов результатов), что вы пытаетесь сделать. Причина, по которой она работает только с 20 записями, состоит в том, что именно она изначально передается на стороне клиента.

Стандартные решения этого являются

  1. Получить весь внешний набор строк в структуру, удерживающей или кэш, а затем обработать его и выполнить внутренние запросы, или

  2. Использование двух различных соединений, так как вы продемонстрировали.

+2

Третий, часто лучший выбор - объединить два запроса в объединение. – erikkallen 2010-11-29 22:34:33

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