Когда закрывать набор результатов (Основной вопрос ODBC) - PullRequest
1 голос
/ 28 ноября 2010

Я работаю над небольшим проектом для местной фирмы, и следующий код прекрасно работает на моей машине, но выдает ошибки на их сервере. В настоящее время у меня нет доступа к этому серверу, и это не та область, о которой я много знаю, поэтому я должен спросить вас, ребята.

Страница написана на классическом ASP (JavaScript для написания сценариев). Логика выглядит так:

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 строк, Что-то не так с моим кодом (на самом деле это не мое поле, но я думаю, что нормально собирать данные в цикле, как это?), Или что-то не так с их сервером IIS.

Спасибо.

редактирование: Больше информации: Это база данных Access. Все довольно стандартно:

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

Запросы немного длинные, поэтому я не буду публиковать их. Они совершенно обычные, поэтому не проблема.

Ответы [ 2 ]

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

У меня было унаследованное приложение Classic ASP, которое я унаследовал, которое было очень похожим (большие запросы с другими запросами, выполняющимися в цикле, получающем результаты первого запроса), которое работало нормально, пока не было возвращено сорок или более записей. Способ, которым я «решил» проблему, заключался в создании другого объекта подключения для выполнения другого запроса. Поэтому, используя свой псевдокод, попробуйте -

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();
2 голосов
/ 29 ноября 2010

На каком сервере они работают?

Большинство новых версий Windows Server вообще не поставляются с драйвером Jet 4.0 для 64-битных систем вообще, поэтому вы не можете использовать базу данных доступа с этим драйвером, еслиВаше приложение работает как 64-битное приложение.Вы можете попробовать запустить 32-битную версию, что может решить проблему.

Существует альтернативный драйвер , упакованный как служебный компонент, который может быть дополнительным.

Попробуйте написатьпростая тестовая страница, которая буквально открывает и закрывает соединение с базой данных следующим образом:

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

Response.Write("Database Opened OK")

conn.Close()

%>

Запустите это на рабочем сервере, и если вы увидите Database Opened OK, то вы будете знать, что это определенно запрос, а не база данных, вызывающаяпроблема.

Если при попытке открыть базу данных возникла ошибка, вам нужно перейти на использование более нового драйвера или попробовать приложение в 32-битном режиме

В случае, если этозапрос, вызывающий проблему, возможно, вам потребуется использовать различные дополнительные аргументы для метода Open(), чтобы попытаться использовать другой курсор (только вперед, если вам нужно только перебрать результаты один раз), что изменит способ ADODBизвлекает данные и, как мы надеемся, устраняет узкие места в производительности, связанные с запросом.

Редактировать

Если выВы хотите попробовать еще немного отладить код и добавить следующее в начале файла.Это приводит к тому, что обработчик сценариев ASP продолжает работу, даже если он сталкивается с ошибкой

On Error Resume Next

Затем с интервалами по всему файлу, где вы ожидаете ошибку, выполните

If Err <> 0 Then
    Response.Write(Err.Number & " - " & Err.Description)
End If

См. эта статья из ASP 101 об основах обработки ошибок в ASP и VBScript

...