Обновленное .net webapp не может открыть соединение с базой данных - PullRequest
1 голос
/ 06 августа 2009

У меня есть старое веб-приложение .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 ]

1 голос
/ 14 октября 2009

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

У меня возникла та же проблема, когда я обновил отлично работающее приложение 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 для деталей):

  1. Разрешить локальные и удаленные подключения с помощью средства настройки наземной области SQL Server 2005 (Я выбираю опцию «Использование как TCP / IP, так и именованных каналов»)
  2. Включить службу браузера SQL Server
  3. Установите для прослушиваемого порта TCP значение 1433 для всех IP-адресов с помощью средства диспетчера конфигурации SQL Server
  4. Наслаждайтесь вашим запущенным веб-приложением: -)

Зачем все это необходимо для успешного подключения веб-приложения .NET 3.5 к SQL Server, когда оно уже работает с .NET 2.0, мне не по силам!

0 голосов
/ 06 августа 2009

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

Другими словами, удалите все отвлекающие факторы, чтобы убедиться, что основной код, который вы пытаетесь запустить, действительно работает правильно.

0 голосов
/ 06 августа 2009

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

0 голосов
/ 06 августа 2009

Вы можете попробовать использовать другой тип строки подключения. Мои строки подключения обычно форматируются как:

<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)) 

право

0 голосов
/ 06 августа 2009

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

...