строка подключения из web.config завершается ошибкой при успешном выполнении идентичной жестко запрограммированной строки (ASP.NET с C #)

#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:

Комментарии:

1. Я понял это, пока отсутствовал прошлой ночью — экранированный в строке подключения интерпретировался как \ в файле конфигурации. Я почти подумал об этом раньше: я попытался добавить больше, чтобы это было \\ в файле конфигурации — я немного разочарован в себе за то, что не подумал наоборот.