SqlConnection.Open() зависает в Windows XP

У меня есть простой фрагмент кода в консольном приложении .NET, который пытается открыть SQL-соединение с сервером:

using (SqlConnection connection = new SqlConnection("<my connection string>"))
{
    connection.Open();
}

Он отлично работает на моем компьютере с Windows 7, но на другом моем компьютере с Windows XP x64 вызов Open() зависает на неопределенный срок.

Любые идеи, почему это происходит или как я могу диагностировать причину? Я запускаю программу из-под учетной записи администратора на обоих компьютерах.

РЕДАКТИРОВАТЬ: Хорошо, похоже, проблема с брандмауэром. Я подключил свой компьютер с Windows 7 к тому же интернет-соединению, что и компьютер с Windows XP, и теперь он тоже зависает... какие порты мне нужно открыть, чтобы пропустить трафик SQL, и как мне их открыть?

РЕДАКТИРОВАТЬ: Если кому-то интересно, мой сетевой администратор блокировал исходящий трафик на порт 1433 из-за страха перед червем Slammer...


person HighCommander4    schedule 04.02.2011    source источник
comment
Вы уверены, что на неопределенный срок? Вы должны получить TimeOutException (по умолчанию 30 секунд). Кроме того, можете ли вы подключиться к экземпляру SQL Server с компьютера с WinXP, используя что-то еще (например, SSMS Express)? Является ли экземпляр SQL Server именованным экземпляром?   -  person bitxwise    schedule 04.02.2011
comment
Если он действительно заблокирован, я бы проверил брандмауэр Windows или другой продукт брандмауэра, чтобы увидеть, пропускает ли он трафик через порты SQL.   -  person Sean    schedule 04.02.2011
comment
@bitxwise ранее сегодня я позволил ему работать более 4 часов. У меня не было тайм-аута.   -  person HighCommander4    schedule 04.02.2011
comment
@HighCommander4: Это странно, по умолчанию должен быть тайм-аут. Вы его отключили?   -  person Matti Virkkunen    schedule 04.02.2011
comment
@Matti Тайм-аут был установлен на 1 час. Я изменил его на 2 секунды, но через 2 секунды он не истекает, он просто зависает.   -  person HighCommander4    schedule 04.02.2011
comment
@HighCommander: есть разница между временем ожидания соединения и временем ожидания команды, убедитесь, что вы устанавливаете время ожидания соединения. Кроме того, является ли экземпляр SQL Server именованным экземпляром? Это важно, так как если ваши настройки DNS не включают домен, в котором находится экземпляр SQL Server, ваш компьютер с WinXP не сможет его найти...   -  person bitxwise    schedule 04.02.2011
comment
@bitxwise Как узнать, является ли экземпляр SQL Server именованным экземпляром?   -  person HighCommander4    schedule 04.02.2011
comment
@HighCommander4: Хм, опубликуйте строку подключения (без фактического имени пользователя/пароля, если вы используете аутентификацию SQL)   -  person bitxwise    schedule 04.02.2011
comment
@bitxwise: Источник данных=database2.ehost-services.com;Исходный каталог=‹отредактировано›;идентификатор пользователя=‹отредактировано›;пароль=‹отредактировано›; Время ожидания подключения = 2000; объединение = «истина»; Максимальный размер пула = 20000   -  person HighCommander4    schedule 04.02.2011
comment
@HighCommander4: я могу успешно пропинговать отправленный вами адрес источника данных, а также попытаться подключиться к нему. Я выложу что-нибудь ниже...   -  person bitxwise    schedule 04.02.2011


Ответы (2)


Поскольку я могу пропинговать и попытаться подключиться к database2.ehost-services.com (хотя мне не удалось войти в систему), давайте попробуем упростить вашу строку подключения:

Data Source=database2.ehost-services.com;Initial Catalog=myDatabaseName;User ID=myUser;Password=myP@ssword;

ИЗМЕНИТЬ

Чтобы ответить на ваш вопрос о том, почему время ожидания вашей строки подключения не истекло, MSDN описывает атрибут pooling строки подключения следующим образом:

Если для этого ключа задано значение true, любое вновь созданное соединение будет добавлено в пул при закрытии приложением. При следующей попытке открыть то же соединение это соединение будет извлечено из пула.

Соединения считаются одинаковыми, если они имеют одинаковую строку соединения. Различные соединения имеют разные строки подключения.

Значение этого ключа может быть «истина», «ложь», «да» или «нет».

Поэтому я думаю, что, возможно, ваш экземпляр соединения еще не был объединен в пул до истечения времени ожидания.

ИЗМЕНИТЬ

Судя по вашему сообщению об ошибке, вы используете NAMED PIPES вместо TCP/IP. Возможно, вам поможет это (используйте диспетчер конфигурации SQL Server, чтобы выбрать протокол). Проверьте [Конфигурация SQL Native Client 9.0/10.0], и вы должны увидеть список протоколов. Убедитесь, что TCP/IP указан в порядке перед именованными каналами, а также ВКЛЮЧЕН. Например, мой порядок 1–3 — это общая память, TCP/IP, именованные каналы и отключено VIA.

ИЗМЕНИТЬ

Попробуйте создать псевдоним с выбранным протоколом TCP/IP и подключиться к вашему псевдониму? Это также можно сделать с помощью диспетчера конфигурации SQL Server.

ИЗМЕНИТЬ

Поскольку ОП решил проблему, я прокомментировал чужой ответ:

Политика безопасности, которая блокирует исходящие сообщения, должна быть создана явно.

а SOB, вот что это было - администратор сети заблокировал исходящий трафик на порту 1433. Рад, что вы разобрались!

person bitxwise    schedule 04.02.2011
comment
С этой строкой подключения время ожидания истекает примерно через 30 секунд и отображается следующая ошибка: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) - person HighCommander4; 04.02.2011
comment
Можете ли вы пропинговать базу данных2.ehost-services.com с компьютера с WinXP? - person bitxwise; 04.02.2011
comment
Просто из любопытства, что такого в этой измененной строке подключения, из-за которой она истекает, а другая нет? - person HighCommander4; 04.02.2011
comment
У вас есть удаленный доступ к ящику SQL Server? - person bitxwise; 04.02.2011
comment
Предполагая, что ваш источник данных является установленным хостом, я думаю, что у них правильно настроена среда. Можно ли использовать SSMS или SSMSE для подключения к источнику данных с компьютера с WinXP? - person bitxwise; 04.02.2011
comment
Я получаю ту же ошибку (A network-related or instance-specific error ...), когда пытаюсь подключиться с помощью SSMSE. - person HighCommander4; 04.02.2011
comment
Попробуйте подключиться с неправильным именем пользователя/паролем. Я получаю ошибку входа в систему, поэтому, если вы не получите то же самое, проблема, вероятно, на вашем компьютере. - person bitxwise; 04.02.2011
comment
Все та же ошибка, когда я использую неправильное имя пользователя/пароль, а не вход в систему. Я предполагаю, что проблема действительно связана с этой машиной, или, точнее, с ее подключением к Интернету... - person HighCommander4; 04.02.2011
comment
Обновленный ответ с документацией MSDN по выбору протокола. - person bitxwise; 04.02.2011
comment
Мои протоколы точно такие, как вы описали - 1, 2, 3 - это общая память, TCP / IP и именованные каналы, и все они включены, а VIA отключен. - person HighCommander4; 04.02.2011
comment
Обновленный ответ с предложением создать псевдоним для экземпляра SQL Server вашего хоста. - person bitxwise; 04.02.2011
comment
С псевдонимом я получаю немного другую ошибку: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.) (Microsoft SQL Server, Error: 10060) - person HighCommander4; 04.02.2011
comment
Я понял: мой сетевой администратор блокировал исходящий трафик на порт 1433. Спасибо за вашу помощь! - person HighCommander4; 09.02.2011

Вы уверены, что ваш сервер базы данных доступен с обоих ваших компьютеров? Пробовали ли вы подключиться к нему из проблемной системы с помощью другого инструмента?

И как долго вы его запускали?

person Matti Virkkunen    schedule 04.02.2011
comment
Вы правы, похоже, это проблема с моим подключением к компьютеру с Windows XP... см. мое редактирование выше. - person HighCommander4; 04.02.2011
comment
@HighCommander4: В тех случаях, с которыми я сталкивался, порта TCP/1433 было достаточно. - person Matti Virkkunen; 04.02.2011
comment
Я думал, что TCP/1433 должен быть открыт на стороне сервера, но не на стороне клиента... - person bitxwise; 04.02.2011
comment
@bitxwise: Ну, он попросил порт. Возможно, у него где-то стоит брандмауэр, который блокирует исходящие соединения? - person Matti Virkkunen; 04.02.2011
comment
Политика безопасности, которая блокирует исходящие сообщения, должна быть явно создана (и для адреса его экземпляра SQL Server). Так что я думаю, что это больше проблема домена... - person bitxwise; 04.02.2011