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。

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

4

3 回答 3

1

I tested a little more, and found out that the same solution can be used inside a class library.

I made a new class (in the class library) with a shared (static) method like this:

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

And extended the MySettings class (in the class library) the same way as in the main project:

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

At least it works in my case. The name of the connection in the main project and in the class library is the same only (the short name, not the whole ProjectNamespace.MySettings.ConnectionName). I haven't tested with having a different name of the connection in the class library, but think it should not matter.

于 2009-01-19T11:27:28.390 回答
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()

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

于 2009-01-16T15:25:28.307 回答
0

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

唯一的选择是重新启动应用程序或回收应用程序池(如果是 Web 应用程序)。除此之外,您将不得不自己动手。

我尽我所能:-)

于 2009-01-16T21:39:00.003 回答