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

StackOverflow https://stackoverflow.com/questions/1236923

Вопрос

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

Он подключается к IP-адресу сервера, так что это не проблема с браузером компьютера (и другие веб-приложения могут нормально подключаться.

TCP и именованные каналы - это 2 сетевых протокола, включенных на сервере sql.

Добавление "Network Library=DBMSSOCN;" в строку подключения изменяет сообщение об ошибке на включение "provider:TCP Provider, ошибка" (на днях я изменил что-то еще в строке подключения, что также повлияло на это, но сейчас я не могу вспомнить, что именно.)


Я уже просмотрел 3 других похожих поста о переполнении стека:
(Не могу перечислить ссылки здесь, потому что я новый пользователь, но идентификаторы их вопросов, если кто-то другой захочет сослаться на них в комментарии, следующие:63875, 1038888, 846479)
И в этой статье на другом сайте было несколько хороших идей о том, что можно попробовать, но это тоже не помогло:
http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx


Мое лучшее предположение заключается в том, что это что-то вызвано обновлением между версиями .net - может быть, что-то не так в web.config?

Это приложение на C #, довольно маленькое / базовое, но было разделено на три проекта.

Это было полезно?

Решение

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

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

Другие советы

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

У меня была точно такая же проблема, когда я обновил идеально работающее приложение 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 на localhost через именованные каналы.Вот почему я подумал, что это не будет иметь абсолютно никакого отношения к разрешению удаленных подключений на SQL Server 2005.Но, как я выяснил, это так и есть!(Я не знаю действительной причины этого!) Я потратил несколько часов, чтобы выяснить это, так что, возможно, это кому-то поможет...

Что вам нужно сделать (пожалуйста, используйте Google для получения подробной информации):

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

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

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

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

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

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

верно?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top