Как вы решаете проблему с ошибкой SQL-запроса? - PullRequest
3 голосов
/ 17 сентября 2010

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

Обратите внимание, что в таблицах, используемых в запросе, нет изменений между сценариями успеха и неудачи. Они точно такие же. Как упоминалось ниже, запрос объединяет несколько таблиц, и результат запроса должен быть пустым. Но время от времени бросает ADO и ошибку.

Как найти причину проблемы?

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


Вот некоторые подробности, которые необходимо знать о любых конкретных альтернативных подходах.

  • Microsoft SQL Server 2008
  • Использование запроса объединяет две таблицы
  • Запрос передается из .NET через взаимодействие, и COM-компонент взаимодействует с ADO для выполнения запроса.
  • Информация об ошибке 0x80004005 (-2147467259) [DBNETLIB] [ConnectionOpen (Connect ()).] SQL Server не существует или доступ запрещен.

Обновление:

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

netstat показал мне, что количество открытых портов резко увеличилось, когда я запустил рабочий процесс. Около 4000 портов запрос не выполняется (0-1023 являются зарезервированными портами). Ответ Джибкова Добрева в здесь указал мне правильное направление.

Ответы [ 5 ]

3 голосов
/ 17 сентября 2010

Прочтите сообщение об ошибке!

Запрос будет "терпеть неудачу" только по нескольким причинам:

  • уникальное или проверочное или другое нарушение ограничения
  • проблема с типом данных (несоответствие, переполнение)
  • ???

Неправильные или противоречивые агрегаты или синтаксис будут обнаружены во время разбора. Но ... * * 1013

  • с динамическим SQL, тогда он может "потерпеть неудачу", потому что это синтаксически неправильно

Он может быть медленным или давать неверные данные, но это не является "неудачей" как таковой.

Edit:

Это не ошибка запроса: это ошибка соединения, не связанная с какой-либо командой SQL.

Как правило, теперь вам нужно решить, связано ли это с одним клиентом или это общая проблема

2 голосов
/ 24 января 2012

В статье базы знаний «Потенциальные причины» пропущена та, которая решила ее для меня - «вы не можете получить доступ к базе данных SQL Server с помощью поставщика OLE DB для SQL Server, когда ваше приложение находится в напряженном сценарии» http://support.microsoft.com/kb/907264

В этой ситуации - процесс запускается некоторое время, извлекая данные в порядке, прежде чем завершится с ошибкой.

Запуск 'netstat -an' покажет все ips / порты открытыми, пока процессбежит.Для меня они сидят на уровне около 20, пока не будет достигнут определенный блок кода ... затем быстро подниматься до 4000+ и приложение не будет работать

2 голосов
/ 17 сентября 2010

«Общий подход к решению проблем» для сбоев SQL-запросов аналогичен любому другому сбою кода:

  • Определите, что он делает .
  • Определите, что он должен делать.
  • Определить почему отличается.
  • Исправить это.

РЕДАКТИРОВАТЬ: После предоставления более конкретной информации в следующей статье базы знаний Microsoft: http://support.microsoft.com/kb/328306 обсуждаются возможные причины и способы решения этой проблемы.

1 голос
/ 17 сентября 2010

Вы можете:

Запустить sql profiler для захвата запроса, убедитесь, что запрос правильно сформирован.Вы можете оставить трассировку на сколько угодно.

Запустите захваченный запрос в Management Studio, сервер sql выдаст все ошибки, с которыми он столкнется.

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

Может быть, даже записать в журналсоставьте запрос и результат в файле журнала из .net и сравните разницу в запросах.

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

0 голосов
/ 20 сентября 2010

Специально для

0x80004005 (-2147467259) [DBNETLIB] [ConnectionOpen (Connect ()).] SQL Server не существует или доступ запрещен.

это, кажется, хорошая отправная точка для расследования: Потенциальные причины появления сообщения об ошибке «SQL Server не существует или доступ запрещен»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...