在运行时更改主应用程序中类库的连接字符串

时间:2009-01-16 14:46:25

标签: vb.net runtime connection-string app-config class-library

您可以像这样在运行时更改连接字符串。您可以将连接字符串设置作为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 个答案:

答案 0 :(得分:1)

我测试了一点,发现相同的解决方案 可以 在类库中使用

我使用这样的共享(静态)方法创建了一个新类(在类库中):

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)。我没有测试过在类库中使用不同的连接名称,但认为它应该没关系。

答案 1 :(得分:0)

我搜索了更多,并找到了一种方法,但它并不是真正的运行时。至少不像我希望的那样运行时。无论如何,这是代码,我测试了它并且它工作,但要求我首先重新启动应用程序这不是我的运行时间。

    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()

This is the article where I found this code.

答案 2 :(得分:0)

感谢您在博客上留言。是的,它几乎不是运行时间,因为它要求您停止运行以获取更改。遗憾的是,由于设置只加载一次(加载应用程序域时),因此设置基础架构无法在运行时获取更改。

唯一的选择是重新启动应用程序或重新启动应用程序池(如果是Web应用程序)。除此之外,你必须自己动手。

我尽我所能: - )