ADODB странное поведение - PullRequest
       30

ADODB странное поведение

3 голосов
/ 29 ноября 2010

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

Это параметры соединения.

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, если это имеет значение.

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

1 Ответ

4 голосов
/ 30 ноября 2010

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

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

  1. * 1006весь внешний набор строк сначала в удерживающую структуру или кэш, затем обработайте его и выполните внутренние запросы, или
  2. Используйте два разных соединения, как вы продемонстрировали.1013 *

...