Обновленное.net webapp не может открыть соединение с базой данных
У меня есть старое веб-приложение.net 1.0, которое требует некоторого обслуживания. Я использовал автообновление, чтобы обновить его до.net 3.5 (а позже попробовал 2.0), но теперь он не может подключиться к базе данных.
На первый взгляд, это похоже на проблему со строкой подключения noob, но я думаю, что это скорее связано с некоторой тонкой проблемой обновления.
Я получаю общее сообщение об ошибке:
Произошла ошибка при установлении соединения с сервером. При подключении к SQL Server 2005 этот сбой может быть вызван тем, что в настройках по умолчанию SQL Server не разрешает удаленные подключения. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server)
Исходный код довольно простой, без наворотов:
protected static SqlConnection objConn;
objConn = new SqlConnection(strConnectionString);
try
{
objConn.Open();
}
а также пробовал как:
using (objConn = new SqlConnection(strConnectionString))
{
objConn.Open();
...
}
Строка подключения происходит из файла web.config, и с помощью отладчика, чтобы установить точку останова и просмотреть свойства соединения, прежде чем он попытается его открыть, я вижу, что он нашел строку соединения правильно:
connectionString = "Источник данных =XXX.XXX.XXX.XXX; Исходный каталог =XXXXXX; Идентификатор пользователя =XXXXXX; Пароль =XXXXXX"
Горстка вещей, я думаю, что я исключил:
Сообщение об ошибке одинаково при подключении к Sql Server 2005 или Sql Server 2000.
Нет ошибок или предупреждений в списке ошибок VS.
Строка подключения такая же, как и на нескольких других веб-сайтах, которые также используют ту же базу данных, поэтому я знаю, что строка подключения правильная.
Я попытался подключить его с моего локального компьютера (где я могу подключиться к базам данных с помощью Sql Query Analyzer) и с обычного веб-сервера, так что это не проблема брандмауэра и не проблема max-соединений.
Он подключается к IP-адресу сервера, поэтому это не проблема браузера компьютера (и другие веб-приложения могут нормально подключаться).
TCP и именованные каналы - это 2 сетевых протокола, включенных на сервере sql.
Добавление "Сетевая библиотека =DBMSSOCN;" в строке подключения изменяется сообщение об ошибке, чтобы включить "поставщик: поставщик TCP, ошибка" (было что-то еще, что я изменил в строке подключения на другой день, который также имел это влияние, но я не могу вспомнить, что сейчас.)
Я уже просмотрел 3 других подобных сообщения о переполнении стека:
(Не могу перечислить ссылки здесь, потому что я новый пользователь, но их идентификаторы вопроса, если кто-то еще хочет дать ссылку на них в комментарии: 63875, 1038888, 846479)
И в этой статье на другом сайте было несколько хороших идей о том, что можно попробовать, но это тоже не помогло:
http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx
Мое лучшее предположение, что это что-то вызвано обновлением между версиями.net - может быть, что-то не так в web.config?
Это приложение на C#, довольно маленькое / базовое, но разделенное на три проекта.
5 ответов
Напишите консольное приложение, которое ничего не делает, но пытается подключиться к базе данных, используя опубликованный вами код. Жесткий код строки подключения в консольной программе.
Другими словами, удалите все отвлекающие факторы, чтобы убедиться, что основной код, который вы пытаетесь запустить, действительно работает правильно.
Поскольку для этой проблемы никогда не было предложено реальное решение, вот то, что мне помогло:
У меня возникла та же проблема, когда я обновил отлично работающее приложение ASP.NET 2.0 до.NET 3.5. Веб-приложение размещается на IIS 5.1 в Windows XP, и я использую SQL Server Express 2005. Я использую следующую строку подключения в моем файле web.config:
<add name="myDbConnection" providerName="System.Data.SqlClient" connectionString="Data Source=http://localhost;Server=.\SQLEXPRESS;Initial Catalog=MyDatabaseName;Integrated Security=True"/>
Итак, как вы видите, я не делаю здесь TCP-соединение или подключение к удаленному серверу. Я просто подключаю экземпляр SQLEXPRESS к локальному хосту через именованные каналы. Вот почему я подумал, что это не будет иметь абсолютно никакого отношения к разрешению удаленных подключений на SQL Server 2005. Но, как я выяснил, это так! (Я не знаю фактической причины этого!) Я потратил несколько часов, чтобы выяснить это, так что, возможно, это кому-то поможет...
Что вы должны сделать (пожалуйста, используйте Google для деталей):
- Разрешить локальные и удаленные подключения с помощью средства настройки контактной зоны SQL Server 2005 (я выбираю параметр "Использование TCP/IP и именованных каналов")
- Включить службу браузера SQL Server
- Установите для прослушивающего TCP-порта значение 1433 для всех IP-адресов с помощью средства SQL Server Configuration Manager.
- Наслаждайтесь вашим запущенным веб-приложением:-)
Почему все это необходимо для успешного подключения веб-приложения.NET 3.5 к SQL Server, когда оно уже работает с.NET 2.0, мне не по силам!
Вы можете попробовать использовать другой тип строки подключения. Мои строки подключения обычно форматируются как:
<add name="DataFrom" connectionString="SERVER=[servername];Database=[dbname];UID=[userid];PWD=[password];"/>
Вы сказали, что другие приложения также работают с приложениями.NET 3.5?
Мне также любопытно, как вам удалось заставить этот кусок кода работать
using (var = new SqlConnection(strConnectionString))
{
objConn.Open();
...
}
Я думаю ты имеешь ввиду
using (objConn = new SqlConnection(strConnectionString))
право?
В соответствии с этим SQL 2005 не настроен для разрешения входящих локальных или удаленных подключений, и вы должны включить его самостоятельно.
Я уверен, что вы уже прошли эти шаги, но... попробуйте включить удаленное соединение для SQL Server и включить службу браузера SQL Server. Прохождение для обоих можно найти здесь.