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

自定义配置 SQL 连接字符串节

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.42/5 (7投票s)

2006年1月17日

CPOL

5分钟阅读

viewsIcon

91143

downloadIcon

1010

本解决方案演示了如何在 App.Config 文件中强制执行有效的 SQL 连接字符串。

引言

Issue

许多 .NET 应用程序似乎都需要至少一个 SQL 数据库连接。开发人员通常将连接字符串存储在 web.configapp.config 文件中。然而,在大型团队中,应用程序会从开发环境迁移到 QA、Staging,最后到生产环境,由于在部署过程中配置应用程序时经常出错,因此通常需要自动化管理这些连接。

配置问题常常引起极大的混乱。我做出以下关于在运行时使用配置数据的假设:

  1. 缺少所需的配置数据(无 SQL 连接字符串)。
  2. 提供的配置数据格式不正确(SQL 连接字符串的 key=value; 对无效)。
  3. 格式正确的配置数据具有无效值(SQL 连接字符串中的服务器名称无效)。

要求

  • 自动化构建产品能够管理 XML 内容。因此,SQL 连接字符串应以 XML 格式存储。
  • 应使用 XML 架构来验证 XML。
  • SQL 连接字符串应存储在 IDictionary 集合中,并在 XML 架构中强制执行唯一键;
  • 如果 SQL 连接字符串被标记为必需,则如果它无法成功连接到 SQL 服务器,必须抛出异常。
  • 所有创建的 SQL 连接字符串都将从 XML 配置元素中检索。

分析

.NET Web 和 Windows 应用程序具有 CONFIG 文件,这些文件可以定义自定义 XML 配置节,从而强制执行要求。IConfigurationSectionHandler 会引发一个事件,用于加载、验证和解析以 XML 格式存储的 SQL 连接字符串。如果您搜索 configSection,可以在本网站上找到其他讨论使用此接口的提交。

挑战在于定义一种 XML 格式,该格式可以使用 XML 架构进行验证,而该 XML 架构定义了 .NET 中有效的 SqlConnection 对象的所有可能组合和排列。例如,如果连接受信任,则不需要用户名和密码组合。

背景

Microsoft .NET 帮助中,SqlConnection.ConnectionString 属性有一个 Remarks 部分,其中包含一个表,定义了可用于 SqlConnection 对象的键。本解决方案仅使用该表中定义的键。

XML

验证

在 .NET 中使用 XmlValidatingReader 验证 XML 文件非常容易。基本上,当 XmlValidatingReader 执行使用 XML 文件的读取过程时,它会在找到无效 XML 时引发一个事件。在此设计中,如果任何 XML 验证失败,将抛出自定义异常。

有几种方法可以触发读取过程。在此情况下,XmlValidatingReader 用于创建 XPathDocument,然后使用它来解析 XML。当 XPathDocument 使用 XmlValidatingReader 读取 XML 时,XML 将使用 XML 架构进行验证。

XML 架构可以位于各种位置。在此情况下,它使用构建事件 $(TargetDir) 宏进行复制,首先删除以前的副本,然后使用 $(ProjectDir) 宏复制最新版本,以便与构建一起包含。

解析

起初,我考虑直接遍历 XPathDocument XML 节点,以便即时构建 SQL 连接字符串或定义一个能够表示所有不同版本的对象。然而,使用 XSLT 进程将配置 XML 解析为更简单的 XML 文档似乎更简单,该文档不适合 XML 架构验证,但更容易转换为 SqlConnection.ConnectionString 对象。

XSLT 文件也可以位于各种位置。在此情况下,它使用构建事件 $(TargetDir) 宏进行复制,首先删除以前的副本,然后使用 $(ProjectDir) 宏复制最新版本,以便与构建一起包含。

使用代码

此示例验证了连接到(本地)SQL Server 实例以连接到 Northwind 数据库的一个简单的受信任连接。我包含了一个 SqlConnectionStringCollectionExample.Xml 文件,我用它进行了测试,其中定义了各种示例 SQL 连接。

例如,app.config 文件中定义了以下自定义配置节:

<SqlConnectionConfigurationSection>
  <SqlConnectionStringCollection 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="SqlConnectionStringCollection.xsd">
    <SqlConnectionString ID="App.Web" Required="true">
      <Authentication><Trusted/></Authentication>
      <Database><Name>Northwind</Name></Database>
    </SqlConnectionString>
  </SqlConnectionStringCollection>
</SqlConnectionConfigurationSection>

在验证架构并执行 XSLT 转换后,它将变成以下 XML:

<SqlConnectionStrings>
  <SqlConnectionString ID="App.Web" Required="true">
      Integrated Security=True; Database=Northwind; Server=(local);
  </SqlConnectionString>
</SqlConnectionStrings>

有效的 SqlConnectionString ID 在 SqlConnectionString.Xsd 架构的 ID 属性中定义

<xs:attribute name="ID" use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:enumeration value="App.Admin" />
      <xs:enumeration value="App.Manager" />
      <xs:enumeration value="App.Staff" />
      <xs:enumeration value="App.Trusted" />
      <xs:enumeration value="App.Web" />
      <xs:enumeration value="Log" />
      <xs:enumeration value="Backup" />
      <xs:enumeration value="Session" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

枚举键是代码中作为键访问 SqlConnectionString 对象的唯一选择。我包含了我在应用程序中使用过的示例。此示例定义了“App.Web”SQL 连接字符串。

MainClass.cs 中定义的 Main 函数中,使用 SqlConnectionConfigurationSectionHandler.Create() 方法创建了一个 SqlConnectionConfigurationStrings 对象。在此情况下,存储了一个可选的 appSetting 值来确定 SqlConnectionConfigurationStrings 对象是否为强制性的。

Main 函数中,有一个示例代码展示了如何检索特定的 SqlConnectionString 对象或迭代 SqlConnectionConfigurationStrings 对象中存储的所有对象。

SqlConnectionString 对象存储在 SqlConnectionConfigurationStrings 中,使用一个受保护的 Hashtable。从 .Config 文件中的 XML SqlConnectionStringCollection 部分检索到的 ID 受 SqlConnectionString 标签的 ID 属性的 xs:enumeration 列表限制。选择此策略是为了确保用作 SqlConnectionConfigurationStrings Hashtable 键的 ID 保持一致。

关注点

  • 定义 SqlConnectionString 对象的原因是,其他函数可以要求此对象来确保使用正确的 SQL 连接字符串!
  • SqlTools.IsValidSqlConnectionString() 要求传入 SqlConnectionString 对象,并通过尝试使用一个假的存储过程来验证设置。如果 SQL 连接参数正确,则会返回一个说明使用了假的存储过程的异常,然后被忽略!
  • 使用 XMLSpy v2006 创建和测试了 XML、XSD 和 XSLT 文件。这是一个优秀的产品,我强烈推荐。

未来修订

可以添加正则表达式来进一步细化 SQL 连接值的验证。服务器名称允许使用数字地址,但是此 XML 架构不验证其语法。

历史

  • 2006 年 1 月 13 日 - 第一个版本。
  • 2006 年 1 月 22 日 - 更新了文档并更改了示例中的默认 App.Config
自定义配置 SQL 连接字符串节 - CodeProject - 代码之家
© . All rights reserved.