За последние 24 часа нас посетили 18809 программистов и 1627 роботов. Сейчас ищут 923 программиста ...

ODBC -> MS Access: разрыв связи

Тема в разделе "PHP и базы данных", создана пользователем ab60, 23 мар 2011.

  1. ab60

    ab60 Активный пользователь

    С нами с:
    3 дек 2008
    Сообщения:
    3
    Симпатии:
    0
    Всем привет! Подозреваю, у меня редкий диагноз:), но вдруг у кого будет идея? Имеем:
    Zend Server community edition (PHP Version 5.3.1),
    odbcjt32.dll 4.00.6305.00 (WinXP),
    Файл \\xxx.xxx.x.x\database\db.mdb.
    Win-сервис на PHP, раз в минуту подключается к БД и обрабатывает данные.

    Получение данных - без вопросов. Сразу скажу: таких сервисов у меня 15, в т.ч. ещё 1 работает с БД Access, и 1 - с двоичными файлами, тоже на удаленном ресурсе. Только здесь связь похуже, через VDSL, и ВОТ: при первой же сетевой ошибке драйвер Access тупеет напрочь и навсегда, лечится только перезапуском сервиса (хотя в каждом цикле есть odbc_close). Т.е. подключение продолжает работать, а данные недоступны. Никаких ошибок в логах.

    Получается, надо как-бы давать драйверу хорошего пинка, но для этого нет средств. А програмка там чужая, и перевод на нормальную СУБД пока под вопросом. И вот что подозрительно: семафор .ldb не удаляется и не изменяется после odbc_close, а только после остановки сервиса (так же и в другой БД Access). Как будто odbc_close тут не работает воще, потому и ошибка остаётся навсегда.

    Пробовал включить протокол ODBC, почитал php_fcgi_err. Действительно, нашёл:

    ld_sovtigas 17c8-1130 EXIT SQLExecDirect with return code -1 (SQL_ERROR)
    HSTMT 034C21C0
    UCHAR * 0x03A592E8 [ -3] "SELECT abspress FROM rateminute WHERE record_time =1300439340\ 0"
    SDWORD -3
    DIAG [S1000] [Microsoft][Драйвер ODBC Microsoft Access] Дисковая или сетевая ошибка. (-1022)

    После этого работа продолжается как ни в чём не бывало (SQL_SUCCESS при всех действиях), а запрос данных даёт:

    DIAG [S0002] [Microsoft][Драйвер ODBC Microsoft Access] Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос 'rateminute'. Проверьте существование таблицы или запроса и правильность имени. (-1305)