#c# #asp.net #web-config #connection-string
#c# #asp.net #web-config #строка подключения
Вопрос:
Я получаю какое-то странное поведение со строкой подключения, переданной из файла конфигурации.
Я создаю n-уровневый веб-сайт (с библиотеками классов C # и C # ASP.NET веб-сайт), и заработала базовая страница, которая извлекает некоторые данные из базы данных (Microsoft SQL Server 2008) через уровни доступа к данным и бизнес-уровней и отображает их на веб-странице. Это выполняется успешно с жестко запрограммированной строкой подключения на уровне доступа к данным.
Чтобы улучшить архитектуру, я удаляю строку подключения к файлу web.config на веб-сайте. Строка подключения успешно извлекается из web.config, но при вызове метода .open() с этой строкой подключения происходит сбой.
С этим конструктором подключение к базе данных работает идеально:
public PathwayAccess() {
connectionString = "server=.\MYSERVER;database=MyDatabase;Integrated Security=SSPI;";
}
С помощью следующего строка извлекается, может быть записана для отладки и выглядит нормально, и не создает исключений:
РЕДАКТИРОВАТЬ web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.0" />
<customErrors mode="Off"/>
</system.web>
<connectionStrings>
<clear/>
<add name="MySqlClientConnectionString"
providerName="System.Data.SqlClient"
connectionString="server=.\MYSERVER;database=MyDatabase;Integrated Security=SSPI;" />
<!-- EDIT: problem was the escaped in the connection string:
should have been .MYSERVER instead of .\MYSERVER as
it doesn't need to be escaped in the config file -->
</connectionStrings>
</configuration>
и новый конструктор для моего класса доступа к данным:
public PathwayAccess() {
ConnectionStringSettingsCollection settings = ConfigurationManager.ConnectionStrings;
if (settings != null) {
foreach (ConnectionStringSettings cs in settings) {
if (cs.Name == "MySqlClientConnectionString" amp;amp; cs.ProviderName == "System.Data.SqlClient") {
connectionString = cs.ConnectionString.ToString();
return;
}
}
throw new Exception("The SqlClient connection string named 'MySqlClientConnectionString' was not found in connection.config. "
"Found " settings.Count " connection strings");
} else {
throw new Exception("Could not retrieve the connection string from a configuration file. Check the connection strings section of the relevant config file");
}
}
Но следующий код будет работать после первого конструктора выше, но выдает исключение InvalidOperationException после второго (с сообщением «Сбой экземпляра»):
myConnection = new SqlConnection(connectionString);
myConnection.Open();
Я очень озадачен этим — по какой-то причине строка подключения из файла конфигурации выглядит идентично жестко запрограммированной, но ведет себя по-другому. Есть идеи, что может происходить?
Комментарии:
1. Содержат ли они какие-либо двойные косые черты ?
2. отладьте вашу строку подключения. кстати: если у вас есть только один cs, вы можете использовать его с: ConnectionString = ConfigurationManager. Строки подключения[0]. Строка подключения или ConnectionString = ConfigurationManager. ConnectionStrings[«MySqlClientConnectionString»]. Строка подключения
3. У вас могут возникнуть проблемы, если ваша строка подключения также содержит простые кавычки. Можете ли вы показать реальное значение вашей строки?
4. Я заменил имя своего сервера на MYSERVER, что скрыло проблему — я изменил вопрос, чтобы показать, в чем была проблема: экранированный в жестко запрограммированной строке, которая интерпретировалась как буквальная \ в версии конфигурации.
Ответ №1:
вам может понадобиться hanselman:http://www.hanselman.com/blog/FixingInstanceFailureWhenConnectingToSQLServer2005Express.aspx
Комментарии:
1. Я понял это, пока отсутствовал прошлой ночью — экранированный в строке подключения интерпретировался как \ в файле конфигурации. Я почти подумал об этом раньше: я попытался добавить больше, чтобы это было \\ в файле конфигурации — я немного разочарован в себе за то, что не подумал наоборот.