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

3

您可以像这样在运行时更改连接字符串。您可以将连接字符串设置作为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是一个简单的字符串设置。它是用户级别的设置,因此每个用户都可以更改它(通过给它分配一个值,类似于上面的代码),并通过调用My.Settings.Save()保存它。

对于最初在主项目中创建并存储在其设置(= app.config文件)中的连接字符串,此代码可正常工作。

app.config中的连接字符串实际上具有更长的名称:MyApp.MySettings.MyConnectionString。

当您在主项目中引用类库项目中存储的app.config中的连接字符串时,这些app.config文件将以某种方式合并,因此类库具有其设置。

我不知道如何在运行时从类库中更改设置。我可以将连接字符串设置从类库复制到主项目的app.config中。我必须保持相同的名称,看起来像:MyClassLibrary.My.MySettings.MyConnectionString。

是否可以将上面展示的相同原则应用于第二个连接字符串?

3个回答

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


如果有人能够确认这一点,我会非常感激。 - Dragoljub Ćurčić

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

这是我找到这段代码的文章。


0

感谢在博客上留言。是的,这几乎不是运行时,因为它需要您停止运行才能拾取更改。不幸的是,由于设置仅在应用程序域加载时加载一次,所以在运行时捕获更改的设置基础结构没有办法。

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

我已经尽力了 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接