Изменить строку подключения из библиотеки классов в основном приложении во время выполнения - PullRequest
3 голосов
/ 16 января 2009

Вы можете изменить строку подключения во время выполнения, как это. Вы делаете настройку строки подключения доступной для записи как отдельное свойство внутри класса MySettings:

Partial Friend NotInheritable Class MySettings
    Public WriteOnly Property RunTimeConnectionString()
        Set(ByVal value)
            My.Settings("MyConnectionString") = value
        End Set
    End Property
End Class

Затем в каком-то месте, когда приложение инициализируется (перед использованием любых табличных адаптеров типизированных наборов данных), напишите что-то вроде:

My.Settings.RunTimeConnectionString = My.Settings.ProductionConnectionString

Где ProductionConnectionString - это простой параметр String. Это параметр «Область пользователя», поэтому каждый пользователь может изменить его (назначив ему значение, аналогичное приведенному выше коду) и сохранить его, вызвав My.Settings.Save ()

Этот код хорошо работает для строк подключения, которые были изначально созданы в основном проекте и сохранены в его настройках (= файл app.config).

Строка подключения в app.config на самом деле имеет более длинное имя: MyApp.MySettings.MyConnectionString.

Если у вас есть строка соединения, хранящаяся в app.config в проекте библиотеки классов, и ссылка на этот проект в основном проекте, файлы app.config будут каким-то образом объединены, поэтому у библиотеки классов есть свои настройки.

То, что не знаю, как это сделать, - это изменить настройку из библиотеки классов во время выполнения. Я мог бы скопировать параметр строки подключения из библиотеки классов в файл app.config основного проекта. Я должен сохранить то же имя, которое выглядит примерно так: MyClassLibrary.My.MySettings.MyConnectionString.

Может ли тот же принцип, который я показал выше, каким-то образом применяться ко второй строке соединения?

Ответы [ 3 ]

1 голос
/ 19 января 2009

Я протестировал немного больше и обнаружил, что то же решение может использоваться внутри библиотеки классов .

Я создал новый класс (в библиотеке классов) с общим (статическим) методом, подобным этому:

Public Class MySettingsChanger
    Public Shared Sub SetConnectionString(ByVal cnnString As String)
        My.Settings.RunTimeConnectionString = cnnString
    End Sub
End Class

И расширен класс MySettings (в библиотеке классов) так же, как в основном проекте:

Namespace My
    Partial Friend NotInheritable Class MySettings
        Public WriteOnly Property RunTimeConnectionString()
            Set(ByVal value)
                My.Settings("MyConnectionString") = value
            End Set
        End Property
    End Class
End Namespace

По крайней мере, это работает в моем случае. Имя соединения в основном проекте и в библиотеке классов одинаково (короткое имя, а не все ProjectNamespace.MySettings.ConnectionName). Я не проверял наличие другого имени соединения в библиотеке классов, но думаю, что это не должно иметь значения.

0 голосов
/ 17 января 2009

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

Единственный вариант - перезапустить приложение или перезапустить пул приложений, если веб-приложение. Кроме того, вам придется бросить свой собственный.

Я сделал все, что мог: -)

0 голосов
/ 16 января 2009

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

    Dim configLocation As String = Reflection.Assembly.GetExecutingAssembly().Location
    Dim config As Configuration.Configuration = Configuration.ConfigurationManager.OpenExeConfiguration(configLocation)
    config.ConnectionStrings.ConnectionStrings.Clear()
    For i As Integer = 0 To Configuration.ConfigurationManager.ConnectionStrings.Count - 1
        Dim connection As New Configuration.ConnectionStringSettings(Configuration.ConfigurationManager.ConnectionStrings(i).Name, My.Settings.ProductionConnectionString)
        connection.ProviderName = Configuration.ConfigurationManager.ConnectionStrings(i).ProviderName
        config.ConnectionStrings.ConnectionStrings.Add(connection)
    Next
    config.Save()

Это статья, где я нашел этот код.

...