如何持久化 My.Settings.ConnectionString 的更改
本文介绍了一种解决方案,该方案可以使用几乎简单的代码来持久化对只读的 My.Settings.ConnectionString 的更改。
引言
My.Settings
类中的连接字符串是应用程序作用域的。 这会在部署应用程序时引起问题,因为开发机器很少与客户的部署目标机器具有相同的连接字符串。 此外,强类型数据集的表适配器从 My.Settings
类获取其连接字符串,这需要某种解决方法。 我见过的最常见的解决方法是在调用 Fill()
之前,使用适当的连接字符串设置 TableAdapter.Connection.ConnectionString
属性。 但是,这对大多数人来说是非直观的,并且对于非常大的项目,更新这些命令可能会有问题。
这是一种更好的方法,用于持久化对强类型数据集的应用程序作用域的连接字符串的更改。 这将处理您想要的任意数量的连接字符串覆盖,只需进行简单的编辑。 无需修改或重新修改 *settings.designer.vb* 文件,也无需在项目中的每个表适配器上设置 TableAdapter.Connection.ConnectionString
设置。
背景
它是如何工作的? 好吧,所有设置,包括应用程序范围的设置,都不会作为只读设置保存在内存中。 因此,运行时值可以被修改,并且所有未来对 My.Settings
项的调用都将获得修改后的值。 应用程序作用域所做的是拒绝持久化它们。 因此,添加到 MySettings
类中的这个小补充允许您
- 更新应用程序范围设置的运行时值。
- 在表适配器引用它们之前,通过
SettingsLoaded
事件应用任何已保存的用户范围的覆盖设置。 - 通过
SettingsSaving
事件将任何修改后的应用程序范围设置持久化到用户范围的覆盖设置。
Using the Code
- 转到您的项目属性,设置,并为每个应用程序作用域的连接字符串创建一个用户作用域的字符串条目,该字符串条目具有相同的基础名称加上添加的后缀。 例如,我使用后缀“UserOverride”。 如果我有两个名为“ConnectionString1”和“ConnectionString2”的应用程序作用域的连接设置,那么我创建两个用户作用域的字符串(不是(连接字符串))称为“ConnectionString1UserOverride”和“ConnectionString2UserOverride”。
- 创建一个名为 *Settings.UserOverride.vb* 的新模块,并插入此代码
- 编辑
userOverrides
()
数组以包括您为之创建了用户覆盖的应用程序中应用程序作用域的连接字符串的名称。 如果您为您的覆盖使用了不同的后缀,那么也请更改userOverrideSuffix
值。 - 现在,无论您需要在哪里更新您的连接字符串,请调用
SetUserOverride()
。 例如,无论何时您想调用My.Settings.ConnectionString1 = "我的新字符串"
, 这是不允许的, 您可以调用My.Settings.SetUserOverride("ConnectionString1", "我的新字符串")
. - 转到我的项目,应用程序设置,并确保启用在关闭时保存 My.Settings。
Option Strict On
Option Explicit On
Namespace My
Partial Friend NotInheritable Class MySettings
Inherits Global.System.Configuration.ApplicationSettingsBase
Private Shared userOverrides() As String = { _
"ConnectionString1", _
"ConnectionString2" _
}
Private Shared userOverrideSuffix As String = "UserOverride"
Public Sub SetUserOverride(ByVal [property] As String, _
ByVal value As String)
Me([property]) = value
End Sub
Private Sub userOverride_SettingsLoaded(ByVal sender As Object, _
ByVal e As System.Configuration.SettingsLoadedEventArgs) _
Handles Me.SettingsLoaded
Dim userProperty As String
For Each appProperty As String In userOverrides
userProperty = appProperty & userOverrideSuffix
If CType(Me(userProperty), String).Length > 0 Then
Me(appProperty) = Me(userProperty)
End If
Next
End Sub
Private Sub userOverride_SettingsSaving(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles Me.SettingsSaving
Dim userProperty As String
For Each appProperty As String In userOverrides
userProperty = appProperty & userOverrideSuffix
Me(userProperty) = Me(appProperty)
Next
End Sub
End Class
End Namespace
' This doesn't work because ConnectionStrings are ReadOnly
'My.Settings.ConnectionString1 = "My new string"
' This works!
My.Settings.SetUserOverride("ConnectionString1", "My new string")
关注点
拉斯维加斯! 沃尔特迪士尼世界佛罗里达! 也许我会想到一些真正有趣的东西。 :)
历史
- 2007 年 7 月 12 日:初始版本。