WEB开发网
开发学院数据库MSSQL Server 深入探讨SQLServer2000对XML的支持 阅读

深入探讨SQLServer2000对XML的支持

 2007-11-11 09:31:49 来源:WEB开发网   
核心提示:我们可以很简单的使用ADO访问数据库中的数据,但是,深入探讨SQLServer2000对XML的支持,如果我们想把从数据库中检索得到的数据以xml(标准化越来越近了)的格式显示出来的话,就要费点神了,在 FOR xml(标准化越来越近了) 子句中指定 RAW 模式, SELECT Customers.CustomerI

  我们可以很简单的使用ADO访问数据库中的数据,但是,如果我们想把从数据库中检索得到的数据以xml(标准化越来越近了)的格式显示出来的话,就要费点神了,当然,我们可以去找一些现成的应用程序或者是把现有的存储过程修改一下,来完成这个想法。
  
    虽说ADO2.5宣称支持xml(标准化越来越近了),但是它仍需要一个额外的层来处理把数据转化成xml(标准化越来越近了)的过程。幸好有了sql server(WINDOWS平台上强大的数据库平台) 2000,它宣称可以直接从数据库中取出数据,而不通过ADO2.5直接把数据以xml(标准化越来越近了)方式显示出来。这个功能极大的提高了构造分布式、数据集中的应用程序的性能,因为这个特性消除了不必要的代码层。
  
    让我们看一看,为了支持xml(标准化越来越近了),sql server(WINDOWS平台上强大的数据库平台) 2000添加了什么新的特性:
  
    1、能够使用 HTTP 访问 sql server(WINDOWS平台上强大的数据库平台)
  
    2、支持 XDR(xml(标准化越来越近了)数据简化)架构并且能够指定对这些架构的 XPath 查询。
  
    3、能够检索并写入 xml(标准化越来越近了) 数据:
  
      使用 SELECT 语句和 FOR xml(标准化越来越近了) 子句检索 xml(标准化越来越近了) 数据。
  
      使用 OPENxml(标准化越来越近了) 行集提供程序写入 xml(标准化越来越近了) 数据。
  
      使用 XPath 查询语言检索 xml(标准化越来越近了) 数据。
  
    4、增强了 Microsoft sql server(WINDOWS平台上强大的数据库平台) 2000 OLE DB 提供程序 (SQLOLEDB),使得可以将 xml(标准化越来越近了) 文档设置为命令文本并以流的形式返回结果集。
  
    可见,我们可以使用好几种方法使用sql server(WINDOWS平台上强大的数据库平台) 2000来访问xml(标准化越来越近了)格式的数据:第一种,在 URL 中执行的查询可以直接访问 sql server(WINDOWS平台上强大的数据库平台) 2000生成xml(标准化越来越近了)文档(也可以调用存储在Web服务器上的xml(标准化越来越近了)模版生成xml(标准化越来越近了)数据文件)。第二种,可以使用SELECT命令和FOR xml(标准化越来越近了)关键字,通过调用一个存储过程或是通过使用XPath查询来取得xml(标准化越来越近了)数据。sql server(WINDOWS平台上强大的数据库平台) 2000 完全支持 XDR(xml(标准化越来越近了)数据简化)架构,具有映射xml(标准化越来越近了)元素和属性到表和字段中的功能。下面,我就探讨一下sql server(WINDOWS平台上强大的数据库平台) 2000对xml(标准化越来越近了)的支持特性。
  
    一、配置sql server(WINDOWS平台上强大的数据库平台) 2000的IIS虚拟目录
  
    在本文的开始,我想先谈一谈如何配置sql server(WINDOWS平台上强大的数据库平台) 2000的IIS虚拟目录。sql server(WINDOWS平台上强大的数据库平台) 2000 允许为IIS创建一个虚拟目录,用来直接访问一个SQL数据库中的数据。一旦在一台配置了IIS的计算机上安装了sql server(WINDOWS平台上强大的数据库平台) 2000,就可以运行sql server(WINDOWS平台上强大的数据库平台) 的 IIS 虚拟目录管理实用工具来配置sql server(WINDOWS平台上强大的数据库平台) 2000的IIS虚拟目录。
  
    好,让我们开始配置过程吧!
  
    在"sql server(WINDOWS平台上强大的数据库平台) 工具"程序组中单击"在 IIS 中配置 SQL xml(标准化越来越近了) 支持",这时就会出现一个与IIS管理器相似的界面。展开服务器,选取默认的 Web 站点,点右键,在弹出的菜单中选取“新建”选项,然后单击"虚拟目录"命令。新虚拟目录的属性页将显示在屏幕上。在"新的虚拟目录属性"对话框的"常规"选项卡上,输入虚拟目录的名称,在本例中,请输入Northwind和物理目录路径(例如 C:InetpubWwwrootNorthwind,假设在 C:InetpubWwwroot 目录中已创建了 Northwind子目录),当然我们也可以使用“浏览”按钮选择目录。在“安全性”选项卡上,填入有效的 sql server(WINDOWS平台上强大的数据库平台) 登录信息,在进入下一个选项卡时,它将要求你确认刚才输入的密码。在“数据源”选项卡上,在“sql server(WINDOWS平台上强大的数据库平台)”框中输入服务器的名称,在“数据库”框中,输入 Northwind 作为默认数据库的名称。在"设置"选项卡上,你可以选择“允许 URL 查询”、“允许模板查询”、“允许 XPath”和“允许 POST”选项。
  
    在构建一个应用程序时,你不但要考虑到能够访问到sql server(WINDOWS平台上强大的数据库平台)数据库,要有足够的安全级别以保证你的数据的安全性。在“虚拟名称”选项卡上,你可以更具自己的需要选择新建模板类型(template)、架构类型(schema)和模板和架构类型(dbonject),并创建它们的路径。好,我们这样就创建了虚拟目录 Northwind。默认情况下,使用该虚拟目录对 Northwind 数据库执行指定的查询。你一定迫不及待的吸纳高看看执行SQL的结果是什么样的了吧?好,让我们在浏览器中输入http://localhost/northwind?sql=SELECT * FROM CUSTOMERS FOR xml(标准化越来越近了) AUTO&root=root,试验一下吧!
  
    我们还可以编程来实现配置sql server(WINDOWS平台上强大的数据库平台) 2000的IIS虚拟目录,请见下面的代码:
  
    Set Objxml(标准化越来越近了) = CreateObject("SQLVDir.SQLVDirControl")
  
    Objxml(标准化越来越近了).Connect 'Connect to the local computer and Web site "1"
  
    Set ObjVDirs = Objxml(标准化越来越近了).SQLVDirs
  
    Set ObjVDir = ObjVDirs.AddVirtualDirectory("Northwind")
  
    ObjVDir.PhysicalPath = "C:Inetpubwwwroot
orthwind"
  
    ObjVDir.UserName = "wayne" 'sql server(WINDOWS平台上强大的数据库平台) login
  
    ObjVDir.Password = "" 'sql server(WINDOWS平台上强大的数据库平台) Password
  
    ObjVDir.DatabaseName = "Northwind"
  
    objVDir.AllowFlags = 73
  
    Set objVNames = objVDir.VirtualNames
  
    objVNames.AddVirtualName "dbobject", 1, ""
  
    objVNames.AddVirtualName "schema", 2,"C:Inetpubwwwroot
orthwindschema"
  
    objVNames.AddVirtualName "template", 4 , "C:Inetpubwwwroot
orthwindemplate"
  
    objxml(标准化越来越近了).Disconnect
  
    msgbox "Done."
  
  
  
  二、使用 HTTP 执行 SQL 语句
  
    使用我们刚才创建的虚拟目录,我们就可以通过把SQL查询语句写入URL的方式执行查询。打开浏览器,在地址栏中写入以下URL:http://localhost/northwind?sql=SELECT+ *+FROM+Customers+WHERE+CustomerID='ANTON' +FOR+xml(标准化越来越近了)+AUTO&root=root,如果你使用的虚拟目录别名不是Northwind或者你使用一个远程服务器,只需要把相应的值改掉就可以了。
  
    浏览器中会出现:
  
  <?xml(标准化越来越近了) version="1.0" encoding="utf-8" ?>
  <root>
  <Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquería" ContactName="Antonio Moreno" ContactTitle="Owner" Address="Mataderos 2312" City="México D.F." PostalCode="05023" Country="Mexico" Phone="(5) 555-3932" />
  </root>
  
  
    让我们来分析一下这个URL,“http://localhost/northwind”后面跟了一个SQL查询语句,用来执行查询数据库Northwind的任务。在本例中,我们使用的查询语句是“SELECT+*+FROM+Customers+WHERE+CustomerID='ANTON'”。请注意,这条语句已经被URL编码过了,其中的空格都被替换成加号“+”,这样它才能被浏览器正确的传送到数据库中去,关于URL编码格式请您参阅相关文档。
  
    在查询语句之后,有添加了两个新的关键字:FOR xml(标准化越来越近了)和AUTO。FOR 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 表,并返回信息。
  
  http://localhost/northwind?sql=SELECT
  Customer.CustomerID%2cCustomer.Contact
  Name%2c%5bOrder%5d.OrderID+FROM+Customers+
  Customer+INNER+JOIN+Orders+%5bOrder%
  5d+ON+Customer.CustomerID%3d%5bOrder%
  5d.CustomerID+FOR+xml(标准化越来越近了)+AUTO&root=Northwind
  
  
  因为返回的xml(标准化越来越近了)文件太长,我就不把它列出来了。
  
    如果你不想在Customers表和Orders表中出现嵌套的话,sql server(WINDOWS平台上强大的数据库平台) 2000还提供另一个关键字用来替代AUTO,这个关键字就是RAW。RAW 模式将查询结果集中的每一行转换为带有类属标识符 row 的 xml(标准化越来越近了) 元素。为了让您能够深入了解RAW,我再给出一个例子:使用 RAW 模式检索客户和订单信息
  
    下面的查询返回客户和订单信息。在 FOR xml(标准化越来越近了) 子句中指定 RAW 模式。
  
  
  SELECT Customers.CustomerID, Orders.OrderID, Orders.OrderDate
  FROM Customers, Orders
  WHERE Customers.CustomerID = Orders.CustomerID
  ORDER BY Customers.CustomerID
  FOR xml(标准化越来越近了) RAW
  
  
    下面是部分结果:
  
  <row CustomerID="ALFKI" OrderID="10643" OrderDate="1997-08-25T00:00:00"/>
  
  <row CustomerID="ANATR" OrderID="10308" OrderDate="1996-09-18T00:00:00"/>
  
  <row CustomerID="ANATR" OrderID="10625" OrderDate="1997-08-08T00:00:00"/>
  
  <row CustomerID="AROUT" OrderID="10355" OrderDate="1996-11-15T00:00:00"/>
  
  
    可以使用外部联接指定上面的查询在结果集中返回所有客户,无论这些客户是否有订单。
  
  
     SELECT C.CustomerID, O.OrderID, O.OrderDate
       FROM Customers C LEFT OUTER JOIN Orders O

Tags:深入 探讨 SQLServer

编辑录入:coldstar [复制链接] [打 印]
赞助商链接