65.9K
CodeProject 正在变化。 阅读更多。
Home

如何持久化 My.Settings.ConnectionString 的更改

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (30投票s)

2007年7月12日

CPOL

2分钟阅读

viewsIcon

301598

downloadIcon

1389

本文介绍了一种解决方案,该方案可以使用几乎简单的代码来持久化对只读的 My.Settings.ConnectionString 的更改。

引言

My.Settings 类中的连接字符串是应用程序作用域的。 这会在部署应用程序时引起问题,因为开发机器很少与客户的部署目标机器具有相同的连接字符串。 此外,强类型数据集的表适配器从 My.Settings 类获取其连接字符串,这需要某种解决方法。 我见过的最常见的解决方法是在调用 Fill() 之前,使用适当的连接字符串设置 TableAdapter.Connection.ConnectionString 属性。 但是,这对大多数人来说是非直观的,并且对于非常大的项目,更新这些命令可能会有问题。

这是一种更好的方法,用于持久化对强类型数据集的应用程序作用域的连接字符串的更改。 这将处理您想要的任意数量的连接字符串覆盖,只需进行简单的编辑。 无需修改或重新修改 *settings.designer.vb* 文件,也无需在项目中的每个表适配器上设置 TableAdapter.Connection.ConnectionString 设置。

背景

它是如何工作的? 好吧,所有设置,包括应用程序范围的设置,都不会作为只读设置保存在内存中。 因此,运行时值可以被修改,并且所有未来对 My.Settings 项的调用都将获得修改后的值。 应用程序作用域所做的是拒绝持久化它们。 因此,添加到 MySettings 类中的这个小补充允许您

  1. 更新应用程序范围设置的运行时值。
  2. 在表适配器引用它们之前,通过 SettingsLoaded 事件应用任何已保存的用户范围的覆盖设置。
  3. 通过 SettingsSaving 事件将任何修改后的应用程序范围设置持久化到用户范围的覆盖设置。

Using the Code

  1. 转到您的项目属性,设置,并为每个应用程序作用域的连接字符串创建一个用户作用域的字符串条目,该字符串条目具有相同的基础名称加上添加的后缀。 例如,我使用后缀“UserOverride”。 如果我有两个名为“ConnectionString1”和“ConnectionString2”的应用程序作用域的连接设置,那么我创建两个用户作用域的字符串(不是(连接字符串))称为“ConnectionString1UserOverride”和“ConnectionString2UserOverride”。
  2. 创建一个名为 *Settings.UserOverride.vb* 的新模块,并插入此代码
  3. 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
  4. 编辑 userOverrides() 数组以包括您为之创建了用户覆盖的应用程序中应用程序作用域的连接字符串的名称。 如果您为您的覆盖使用了不同的后缀,那么也请更改 userOverrideSuffix 值。
  5. 现在,无论您需要在哪里更新您的连接字符串,请调用 SetUserOverride()。 例如,无论何时您想调用 My.Settings.ConnectionString1 = "我的新字符串", 这是不允许的, 您可以调用 My.Settings.SetUserOverride("ConnectionString1", "我的新字符串").
  6. ' This doesn't work because ConnectionStrings are ReadOnly
    'My.Settings.ConnectionString1 = "My new string"
    
    ' This works!
    My.Settings.SetUserOverride("ConnectionString1", "My new string")
  7. 转到我的项目,应用程序设置,并确保启用在关闭时保存 My.Settings

关注点

拉斯维加斯! 沃尔特迪士尼世界佛罗里达! 也许我会想到一些真正有趣的东西。 :)

历史

  • 2007 年 7 月 12 日:初始版本。
© . All rights reserved.