проблема исключений с odbc и C ++ вызывает странное поведение базы данных - PullRequest
0 голосов
/ 11 июня 2009

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

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

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

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

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

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

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

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

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

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

HELP!

Ответы [ 2 ]

0 голосов
/ 11 июня 2009

Есть ли вероятность, что оператор обновления записывает данные, слишком большие для его поля, или ноль, если значения NULL не разрешены?

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

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

0 голосов
/ 11 июня 2009

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

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

...