Решение ошибки тайм-аута для SQL-запроса - PullRequest
8 голосов
/ 14 июля 2011

Я получаю эту ошибку:

Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.

Я знаю, что уже есть руководства, помогающие решить эту проблему, но они не работают для меня. Чего мне не хватает или где мне добавить код в эти операторы SQL в моей программе на C #:

String sql = project1.Properties.Resources.myQueryData;

SqlDataAdapter sqlClearQuestDefects = new SqlDataAdapter(sql,
    "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");

DataSet lPlanViewData = new DataSet();
sqlClearQuestDefects.Fill(lPlanViewData, "PlanViewData");

Я получаю сообщение об ошибке тайм-аута в этой строке:

SqlDataAdapter sqlClearQuestDefects = new SqlDataAdapter(sql, 
    "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");

Ответы [ 5 ]

14 голосов
/ 14 июля 2011
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand.CommandTimeout = 0;  // Set the Time out on the Command Object
5 голосов
/ 14 июля 2011

Вы пытаетесь подключиться к SQL Server, и это занимает больше времени, чем ADO.NET готов ждать.

Попробуйте подключиться к тому же серверу, используя то же имя пользователя и пароль, используя SQL Server Management Studio. Если вы получаете ту же ошибку, либо что-то не так с вашей строкой соединения, указанный вами сервер не работает, либо вы не можете получить доступ к серверу через сеть, где бы вы ни находились (возможно, вы используете публичный IP-адрес). адрес пытается получить доступ к внутреннему имени сервера). Я не могу вспомнить сценарий, в котором вы вводите тот же сервер и учетные данные в SSMS и подключаетесь, затем делаете то же самое в ADO.NET и терпите неудачу.

Если вы находитесь в медленной сети, вы можете попробовать увеличить значение тайм-аута. Однако, если соединение вообще произойдет, оно должно произойти довольно быстро.

Ознакомьтесь с настройками собственного клиента SQL и настройками сервера SQL на сервере. Есть раздел для разрешенных протоколов; SQL может подключаться с использованием различных протоколов. Обычно вам требуется TCP / IP для сервера в сети и именованные каналы для сервера, работающего на вашем компьютере.

РЕДАКТИРОВАТЬ ИЗ КОММЕНТАРИИ: О, это нормально; случается все время. Время от времени в сети TCP пакеты «сталкиваются» или «теряются» при передаче. Это известная слабость технологий коммутации пакетов, которые в большинстве случаев управляются самим протоколом TCP. Один случай, когда его нелегко обнаружить, - это когда первоначальный запрос на соединение теряется в случайном порядке. В этом случае сервер не знает, что был запрос, а клиент не знал, что его запрос не был получен. Итак, все, что может сделать клиент, это сдаться.

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

SqlDataAdapter sqlClearQuestDefects;

short retries = 0;
while(true)
{
    try
    {
       sqlClearQuestDefects = new SqlDataAdapter(sql, "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");
         break;
    }
    catch(Exception)
    {
       retries++;
         //will try a total of three times before giving up
       if(retries >2) throw;    
    }
}
2 голосов
/ 14 июля 2011

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

 Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa; Connection Timeout=120

Где 120 = 120 секунд.Насколько я помню, по умолчанию 20 или 30.

1 голос
/ 04 мая 2012

Недавно столкнулся с этой проблемой и нашел разрешение , которое у меня работало .

Кстати, установка Timeout = 0 помогла избежать исключения, но время выполнения было неоправданным, в то время какРучное выполнение процедуры магазина заняло несколько секунд.

Итог: я добавил SET IMPLICIT_TRANSACTIONS OFF к хранимой процедуре, которая используется для заполнения набора данных.

Из MSDN:

Поставщик OLE DB для собственного клиента SQL Server для SQL Server и драйвер ODBC для собственного клиента SQL Server автоматически устанавливают для IMPLICIT_TRANSACTIONS значение OFF при подключении.По умолчанию для SET IMPLICIT_TRANSACTIONS установлено значение OFF для соединений с управляемым провайдером SQLClient и для запросов SOAP, полученных через конечные точки HTTP.[...] Когда SET ANSI_DEFAULTS включен, SET IMPLICIT_TRANSACTIONS включен.

Поэтому я считаю, что в моем случае значения по умолчанию были не такими, как требуется.(Я не мог проверить это. У меня недостаточно прав на сервере SQL).Но добавление этой строки в мой SP решило проблему.

ВАЖНО: В моем случае транзакция мне не понадобилась, поэтому у меня не было проблемы отменить настройку неявной транзакции.Если в вашем случае транзакция является обязательной, вы, вероятно, не должны использовать это решение.

1 голос
/ 14 июля 2011

Вероятно, это проблема соединения с вашей базой данных, например, если у вас была следующая строка соединения:

"Data Source=MyDatabaseServer...

Тогда вам необходимо убедиться, что:

  • компьютер MyDatabaseServer подключен к сети и доступен с компьютера, на котором выполняется приложение (под именем «MyDatabaseServer») *
  • Сервер баз данных работает на MyDatabaseServer
  • Сервер базы данных на MyDatabaseServer настроен на прием подключений от удаленных компьютеров
  • Параметры брандмауэра как на локальном компьютере, так и на MyDatabaseServer правильно настроены для разрешения подключений к SQL Server через
  • Вашимя пользователя / пароль и т. д. ... верны

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

Естьмножество статей, посвященных проблемам с подключением к SQL Server - выполните поиск в Google по конкретному сообщению об ошибке илиЭто конкретный вопрос на Ошибка сервера

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