我们可以很简单的使用ADO访问数据库中的数据但是如果我们想把从数据库中检索得到的数据以XML的格式显示出来的话就要费点神了当然我们可以去找一些现成的应用程序或者是把现有的存储过程修改一下来完成这个想法
虽说ADO宣称支持XML但是它仍需要一个额外的层来处理把数据转化成XML的过程幸好有了SQL Server 它宣称可以直接从数据库中取出数据而不通过ADO直接把数据以XML方式显示出来这个功能极大的提高了构造分布式数据集中的应用程序的性能因为这个特性消除了不必要的代码层
让我们看一看为了支持XMLSQL Server 添加了什么新的特性
能够使用 HTTP 访问 SQL Server
支持 XDR(XML数据简化)架构并且能够指定对这些架构的 XPath 查询
能够检索并写入 XML 数据
使用 SELECT 语句和 FOR XML 子句检索 XML 数据
使用 OPENXML 行集提供程序写入 XML 数据
使用 XPath 查询语言检索 XML 数据
增强了 Microsoft SQL Server OLE DB 提供程序 (SQLOLEDB)使得可以将 XML 文档设置为命令文本并以流的形式返回结果集
可见我们可以使用好几种方法使用SQL Server 来访问XML格式的数据第一种在 URL 中执行的查询可以直接访问 SQL Server 生成XML文档(也可以调用存储在Web服务器上的XML模版生成XML数据文件)第二种可以使用SELECT命令和FOR XML关键字通过调用一个存储过程或是通过使用XPath查询来取得XML数据SQL Server 完全支持 XDR(XML数据简化)架构具有映射XML元素和属性到表和字段中的功能下面我就探讨一下SQL Server 对XML的支持特性
一配置SQL Server 的IIS虚拟目录
在本文的开始我想先谈一谈如何配置SQL Server 的IIS虚拟目录SQL Server 允许为IIS创建一个虚拟目录用来直接访问一个SQL数据库中的数据一旦在一台配置了IIS的计算机上安装了SQL Server 就可以运行SQL Server 的 IIS 虚拟目录管理实用工具来配置SQL Server 的IIS虚拟目录
好让我们开始配置过程吧!
在SQL Server 工具程序组中单击在 IIS 中配置 SQL XML 支持这时就会出现一个与IIS管理器相似的界面展开服务器选取默认的 Web 站点点右键在弹出的菜单中选取新建选项然后单击虚拟目录命令新虚拟目录的属性页将显示在屏幕上在新的虚拟目录属性对话框的常规选项卡上输入虚拟目录的名称在本例中请输入Northwind和物理目录路径(例如 C:\Inetpub\Wwwroot\Northwind假设在 C:\Inetpub\Wwwroot 目录中已创建了 Northwind子目录)当然我们也可以使用浏览按钮选择目录在安全性选项卡上填入有效的 SQL Server 登录信息在进入下一个选项卡时它将要求你确认刚才输入的密码在数据源选项卡上在SQL Server框中输入服务器的名称在数据库框中输入 Northwind 作为默认数据库的名称在设置选项卡上你可以选择允许 URL 查询允许模板查询允许 XPath和允许 POST选项
在构建一个应用程序时你不但要考虑到能够访问到SQL Server数据库要有足够的安全级别以保证你的数据的安全性在虚拟名称选项卡上你可以更具自己的需要选择新建模板类型(template)架构类型(schema)和模板和架构类型(dbonject)并创建它们的路径好我们这样就创建了虚拟目录 Northwind默认情况下使用该虚拟目录对 Northwind 数据库执行指定的查询你一定迫不及待的吸纳高看看执行SQL的结果是什么样的了吧?好让我们在浏览器中输//localhost/northwind?sql=SELECT * FROM CUSTOMERS FOR XML AUTO&root=root试验一下吧!
我们还可以编程来实现配置SQL Server 的IIS虚拟目录请见下面的代码
Set ObjXML = CreateObject(SQLVDirSQLVDirControl)
ObjXMLConnect Connect to the local computer and Web site
Set ObjVDirs = ObjXMLSQLVDirs
Set ObjVDir = ObjVDirsAddVirtualDirectory(Northwind)
ObjVDirPhysicalPath = C:\Inetpub\wwwroot\northwind
ObjVDirUserName = wayne SQL Server login
ObjVDirPassword = SQL Server Password
ObjVDirDatabaseName = Northwind
objVDirAllowFlags =
Set objVNames = objVDirVirtualNames
objVNamesAddVirtualName dbobject
objVNamesAddVirtualName schema C:\Inetpub\wwwroot\northwind\schema
objVNamesAddVirtualName template C:\Inetpub\wwwroot\northwind\template
objXMLDisconnect
msgbox Done
二使用 HTTP 执行 SQL 语句
使用我们刚才创建的虚拟目录我们就可以通过把SQL查询语句写入URL的方式执行查询打开浏览器在地址栏中写入以下//localhost/northwind?sql=SELECT+ *+FROM+Customers+WHERE+CustomerID=ANTON +FOR+XML+AUTO&root=root如果你使用的虚拟目录别名不是Northwind或者你使用一个远程服务器只需要把相应的值改掉就可以了
浏览器中会出现
<?xml version= encoding=utf ?>
<root>
<Customers CustomerID=ANTON CompanyName=Antonio Moreno Taquería ContactName=Antonio Moreno ContactTitle=Owner Address=Mataderos City=México DF PostalCode= Country=Mexico Phone=() />
</root>
让我们来分析一下这个URL//localhost/northwind后面跟了一个SQL查询语句用来执行查询数据库Northwind的任务在本例中我们使用的查询语句是SELECT+*+FROM+Customers+WHERE+CustomerID=ANTON请注意这条语句已经被URL编码过了其中的空格都被替换成加号+这样它才能被浏览器正确的传送到数据库中去关于URL编码格式请您参阅相关文档
在查询语句之后有添加了两个新的关键字FOR XML和AUTOFOR XML关键字可以对现有的关系数据库执行 SQL 查询以返回 XML 文档形式AUTO模式则将查询结果作为嵌套 XML 元素返回在 FROM 子句内每个在 SELECT 子句中至少有一列被列出的表都表示为一个 XML 元素SELECT 子句中列出的列映射到适当的元素特性当指定了 ELEMENTS 选项后表列映射到子元素而非特性默认情况下AUTO 模式将表列映射到 XML 特性
在FOR XML AUTO后还需要添加一个参数root其参数值作为返回的XML文件的root元素名比如说你可以把上面我给出的例子中的root的参数值设为Northwind你会发现返回的XML文件中除了root元素名变为Northwind了以外其它都没有变化
上面我们说的是直接使用HTTP中执行简单的查询除此之外你还可以执行更加复杂的查询比如说连接不同的表进行查询请看下面的例子在下例中SELECT 语句连接了 Northwind 数据库的中的 Customers 和 Orders 表并返回信息
//localhost/northwind?sql=SELECT
CustomerCustomerID%cCustomerContact
Name%c%bOrder%dOrderID+FROM+Customers+
Customer+INNER+JOIN+Orders+%bOrder%
d+ON+CustomerCustomerID%d%bOrder%
dCustomerID+FOR+XML+AUTO&root=Northwind
因为返回的XML文件太长我就不把它列出来了
如果你不想在Customers表和Orders表中出现嵌套的话SQL Server 还提供另一个关键字用来替代AUTO这个关键字就是RAWRAW 模式将查询结果集中的每一行转换为带有类属标识符 row 的 XML 元素为了让您能够深入了解RAW我再给出一个例子使用 RAW 模式检索客户和订单信息
下面的查询返回客户和订单信息在 FOR XML 子句中指定 RAW 模式
SELECT CustomersCustomerID OrdersOrderID OrdersOrderDate
FROM Customers Orders
WHERE CustomersCustomerID = OrdersCustomerID
ORDER BY CustomersCustomerID
FOR XML RAW
下面是部分结果
<row CustomerID=ALFKI OrderID= OrderDate=T::/>
<row CustomerID=ANATR OrderID= OrderDate=T::/>
<row CustomerID=ANATR OrderID= OrderDate=T::/>
<row CustomerID=AROUT OrderID= OrderDate=T::/>
可以使用外部联接指定上面的查询在结果集中返回所有客户无论这些客户是否有订单
SELECT CCustomerID OOrderID OOrderDate
FROM Customers C LEFT OUTER JOIN Orders O