【问题标题】:Change connection string from class library in main application at run-time在运行时从主应用程序中的类库更改连接字符串
【发布时间】:2010-10-01 19:47:38
【问题描述】:

您可以像这样在运行时更改连接字符串。您可以在 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。

我上面展示的相同原理能否以某种方式应用于第二个连接字符串?

【问题讨论】:

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


    【解决方案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)。我没有测试过在类库中使用不同的连接名称,但认为这不重要。

    【讨论】:

    • 如果有人能证实这一点,我将不胜感激。
    【解决方案2】:

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

        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.

    【讨论】:

      【解决方案3】:

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

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

      我已经尽力了:-)

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多