Сбой подключения к SQL-серверу после повторного подключения к сети - PullRequest
0 голосов
/ 09 марта 2012

Я работаю над обновлением приложения, которое использует DAO для доступа к SQL Server. Я знаю, но давайте пока посмотрим на DAO.

Приложение все время работает в системном трее и периодически выполняет операции сервера SQL. Поскольку оно работает все время, и пользователи приложения будут работать на ноутбуках и переходить между зданиями, я разработал его для тихого перехода между активным и неактивным состояниями. После успешного подключения к базе данных операции возобновляются.

У меня есть одна последняя проблема перед выпуском этого обновления: когда соединение сбрасывается, а затем восстанавливается, операции SQL завершаются неудачно. Это происходит, только если я указал имя хоста в строке подключения. Если я использую IP, все в порядке (но мне нужно иметь возможность использовать имя хоста).

Вот поведение:

1) Все работает. Хорошее сетевое соединение, с базой данных все в порядке.

2) Потерянное соединение. Маленький значок «х» появляется на значке панели задач, и ничего больше. Все ок.

3) Переподключиться.

На шаге 3 при выполнении первого запроса я получаю ошибку «ODBC - call failed». Интересно, что база данных сначала открывается без ошибок.

Если я пропускаю шаг 1 и запускаю приложение, когда соединение разорвано, на шаге 3 все работает нормально, имя хоста или нет.

Я ожидаю, что это проблема с механизмом DAO, кэширующим запись DNS после первого подключения, хотя IP-адрес назначения не изменяется, поэтому я не уверен в этом. Я попытался очистить кэш DNS Windows (из командной строки cmd) безрезультатно. Такое же поведение происходит, даже когда я использую свое локальное имя хоста с локальным сервером SQL, который я настроил для разработки. 127.0.0.1 не имеет проблем.

Я также пытался CoUninitialize () интерфейс DAO между активными временами, но мне было трудно заставить это работать. Если кто-то думает, что это поможет, я буду усерднее работать над этим.

Это поведение одинаково в Windows XP или 7.

Спасибо за все, что у вас есть!

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

m_pDb = m_pDaoEngine->OpenDatabase()

1 Ответ

0 голосов
/ 13 марта 2012

В итоге я укусил пулю и преобразовал приложение в ADO. Теперь все работает хорошо, и операции с базами данных загружаются намного быстрее.

...