2009-06-10 2 views
0

У меня есть приложение на C++ (скомпилировано с VS2003, работающее на сервере Windows 2000 с базой данных SQL 2000), которое отлично работает в течение многих лет и теперь сбой.проблема с исключениями с odbc и C++ вызывает странное поведение базы данных

My logging показывает, что соединение с базой данных (ODBC с использованием драйвера SQL Server) будет работать нормально (считывать и обновлять базу данных), после того как исключение будет выбрано (и поймано/зарегистрировано, но нет реальной детали), соединение может читать данные из базы данных, но больше не может обновлять базу данных.

Итак, я вижу, что поток читает следующую строку для обработки, отправляет данные из сокета на другой сервер, пытается обновить запись как обработанную и BOOM.

Единственная информация об ошибке я вернусь из отказавшего запроса:

[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. [37000] 

следует заготовки, как, где вы обычно видите причину неудачного запроса (плохой синтаксис, таблица не найдена, что угодно, но на этот раз ничего).

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

В последний раз я быстро посмотрел на диспетчер задач (он быстро отскакивает, поэтому я не могу исследовать надолго), и приложение использовало типичную 5-6 мегабайт ОЗУ, а остальные ресурсы выглядели нормально.

Другие приложения используют базу данных и не имеют ошибок за это время.

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

HELP!

ответ

0

Из-за ошибки "[Microsoft] [ODBC SQL Server Driver] [SQL Server] Операторы не могут быть подготовлены. [37000]« Я предполагаю, что драйвер ODBC пытается подготовить оператор. Это вызвало множество нерегулярных проблем.

В определении источника данных ODBC снимите флажок «Создать временные хранимые процедуры для подготовленного SQL ...» и посмотрите, исправляет ли эта ошибка.

0

Любая вероятность того, что инструкция update слишком велика для своего поля или null, если nulls не разрешены?

Возможно, вы можете зарегистрировать обновления в файле, чтобы определить, связана ли проблема с данными.

Я не уверен, что драйвер ODBC SQL Server использует ADO, но я думаю, что ADO имеет утечку в своем обновлении и вставляет код, который будет постепенно потреблять всю вашу память. Если вы получаете крах последовательно после примерно того же количества записей, вы можете захотеть расследовать.