Строка подключения из web.config завершается неудачно, если идентичная жестко запрограммированная строка завершается успешно (ASP.NET с C #) - PullRequest
0 голосов
/ 09 мая 2011

Я получаю странное поведение со строкой соединения, переданной из файла конфигурации.

Я создаю 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" && 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 голосов
/ 09 мая 2011

вам может понадобиться гансельман: http://www.hanselman.com/blog/FixingInstanceFailureWhenConnectingToSQLServer2005Express.aspx

...