Решение ошибки тайм-аута для SQL-запроса

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

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

Я знаю, что уже есть гиды, которые помогут решить эту проблему, но они не работают на меня. Что мне не хватает или где я должен добавить код к этим 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 ответов


SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand.CommandTimeout = 0;  // Set the Time out on the Command Object

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

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

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

взгляните на параметры собственного клиента SQL и параметры SQL Server на сервере. Существует раздел для разрешенных протоколов; 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;    
    }
}

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

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

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


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

"Data Source=MyDatabaseServer...

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

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

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

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


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

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

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

из MSDN:

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

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

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