использование строки подключения из web.config вместо app.config - PullRequest
0 голосов
/ 09 февраля 2011

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

Сделал пару вещей. Чтобы мой адаптер использовал другую строку подключения, я наткнулся на this . Но в конце концов я обнаружил, что делать следующее удобно:

Dim adapter as New MyReqeustTableAdapter()
adapter.Connection.ConnectionString = sMyConnectionString

Затем я попытался взять строку подключения из моей конфигурации (app.config) для имитации. Я добавил раздел вручную с помощью ключа «myconstr». Моей идеей было сделать что-то вроде:

sMyConnectionString = ConfigurationManager.ConnectionString("myconstr").ConnectionString

Но мой intellisense не смог обнаружить ConfigurationManager. Поэтому пришлось добавить соответствующую ссылку на проект.

Далее я добавил строку подключения через дизайнер настроек для проекта веб-приложения. Я дал вышеуказанный ключ для ссылки на него. Однако вышеприведенная оценка, похоже, выдает исключение нулевой ссылки.

Ответы [ 5 ]

1 голос
/ 11 сентября 2013

Предположим, вы создали библиотеку классов.В нем вы определили свойство Settings, которое выглядит следующим образом:

Properties.Settings.Default.ProjectName

Visual Studio может автоматически сгенерировать некоторую конфигурацию для вас следующим образом:

(app.config)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MyDllProject.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <MyDllProject.Properties.Settings>
            <setting name="ProjectName" serializeAs="String">
                <value>MyDllproject</value>
            </setting>
        </MyDllProject.Properties.Settings>
    </applicationSettings>
</configuration>

Теперь предположим, что вы добавили эту сборку в проект.И вы получаете доступ к его настройкам, вы, скорее всего, получите MyDllproject в качестве значения.Это несмотря на добавление любой конфигурации.Зачем?Потому что, когда сборка была сгенерирована, она была как бы записана в ней.И написанный код таков, что при отсутствии переопределения конфигурации используйте то, что было определено в app.config во время генерации.

Теперь в вашем целевом проекте вы просто добавляете необходимые разделы в конфигурациюфайл в следующем шаблоне

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>

        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <!-- start: copied from app.config of class library -->
            <section name="MyDllProject.Properties.Settings" 
                type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" 
                />
            <!-- end: copied from app.config of class library -->

            <!-- other sections may follow -->
        </sectionGroup>

    </configSections>

    <applicationSettings>
        <!-- remember to maintain the same order as how it was defined in the sectionGroup -->

        <!-- start: copied from app.config of class librarly -->
        <MyDllProject.Properties.Settings>
            <setting name="ProjectName" serializeAs="String">
                <value>ConsoleProjectB</value>
            </setting>
        </MyDllProject.Properties.Settings>
        <!-- end: copied from app.config of class library -->

        <!-- other configurations settings may follow -->
    </applicationSettings>
</configuration>

Вот так.

Вот небольшой пример проекта, с которым я связался: http://sdrv.ms/16ksPef

0 голосов
/ 07 марта 2011

Исходя из вашего вопроса, я думаю, вы создаете n-слойное приложение.Я думаю, что вам лучше использовать две опции, которые вы упомянули.

Вам просто нужно создать базовый класс для ваших классов DAL (Data Access Layer), который будет иметь открытое свойство, содержащее эту строку соединения.

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

 public class DALBase
 {
     public static string connString
     {
         get { return "Data Source=localhost\\SqlExpress;Initial Catalog=theDb Integrated Security=True"; }
     }
 }
0 голосов
/ 09 февраля 2011

Файл конфигурации (app.config), который определен в проекте библиотеки классов , не может автоматически использоваться системой. Единственный файл конфигурации, который можно использовать - это файл web.config в веб-приложениях или *myexe.exe*.config в приложениях exe, где exe-файл равен *myexe.exe*.

Итак, вы, кажется, пытаетесь добавить app.config в библиотеку классов. Это не сработает.

Возможно связать второй файл конфигурации с web.config, но эта проблема вам не поможет.

0 голосов
/ 07 марта 2011

По сути, вам нужна возможность изменить глобальный параметр вашей библиотеки извне.Использование app.config само по себе не дает такой возможности сразу - вы еще не раскрыли внутренние настройки вашей библиотеки.Имея это в виду, один очень простой способ добиться экспозиции - создать в вашей библиотеке присваиватель для app.config.

public static class Setter
{
    public static void Set(string name, string value)
    {
        Properties.Settings.Default[name] = value;
    }
}

Затем при запуске веб-приложения в global.asax или в другом месте:

MyLibrary.Setter.Set("X", ConfigurationManager.ConnectionStrings["Y"].ConnectionString);
0 голосов
/ 09 февраля 2011

вы можете добавить ссылку на System.Web и использовать System.Web.Configuration.WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString) из проекта библиотеки классов

...