技术开发 频道

用XML代替SQL来操作数据库

       [IT168技术文档]随着Internet的飞速发展,W3C成员意识到必须找到一种办法将数据和Web的表现方式分离出来,于是XML诞生了。当今的XML已经成为IT领域各个数据(特别是文档)的首选格式。由于它具有标记不同字段的能力,因此使搜索变得更简单。从微软发布SQL Server 2000的时候,就读XML数据的存储和检索提供内置的支持。而且微软早已意识到必须对其不断地改进,以便和不断发展的W3C的XML标准保持一致。在微软发布SQL Server 2000的几个月之后,它便在Web站点上发布了完全可以支持XML特性的软件包提供免费的下载。这些软件包被称作SQLXML(XML for SQL Server),当时的版本是3.0。5年之后,SQL Server 升级到了SQL Server 2005,提供了一系列的新的功能和特性,比如对新的XML数据类型的支持;提供了新的Data Access Provider——Native Client;等等。为了提供对这个新的功能的支持,和对原来版本的改进,SQLXML4.0被推出来。SQLXML4.0已经成为了一种成熟的数据访问技术。

我们怎么来看待SQLXML呢?它到底能为我们作些什么呢?我们可以把数据库中的数据和XML数据看成是同一数据的不同表现形式。如果能过在这两种数据表现形式之间提供一种Mapping,那么我们就可以实现这两种数据表现形式的转换。换句话说,我们就可以同样的数据从机遇关系数据库的存储形式,转变成标记语言的XML格式。而SQLXML就是实现了这样一种Mapping机制,并在此基础上提供机遇XML(而不是纯SQL)的数据操作方法。通过SQLXML,我们不但可以以XML的格式获取查询结果,我们还可以通过提过一个具有某种格式的XML实现数据库的添加,删除和修改;我们还可以提供一种有效的方式实现基于XML的数据批量上传。

在这里,我不打算做深入的介绍,只是通过提供一个简单的例子,是大家对SQLXML有一个感性的认识。如果大家有兴趣,我可以在后续的文章做详细的介绍。

我们的例子是这样的:在数据库库中,有两张表T_ORDER和T_ORDER_DETAIL,用于存储订单和订单明晰的信息。我们要做的是,通过SQLXML把相关数据已XML的形式取出,通过XSLT转化成HTML,从而生成我们的Web Page。所以这是一个简单的Web 应用。

表的结构,由于我们主要的目的在于介绍SQLXML,我们把业务逻辑和数据结构尽量精简。

 


注:这是我比较喜欢的一种数据表的设计方式:为每个表加上以下六个公共的字段——CREATED_BY,CREATED_ON,LAST_UPDATED_BY,LAST_UPDATED_ON,VERSION_NO,TRANSACTION_NO。前4个字段指明每条数据的建立和被最后写该得人的时间,有利于敏感数据的追踪和记录Log。VERSION_NO是一个Timestamp类型的字段,用于判断数据的并发。TRANSACTION_NO记录的书该记录的创建的更新属于某个原子事务,有利于进行Audit Log。就以上面这两个表为例,如果我们设计的数据非常敏感,我们需要有一个机制来记录每一次数据的创建和更新——操作时在什么时候,操作者是谁,原来的数据是什么,新的数据是什么。那么上面这样的结构可以为我们实现这样的功能。如果有机会,我们给大家详细的实现方式——我曾经为原来的公司做过相应的设计和实现,我觉得其设计理念的实现对于一个企业级别的应用来说还是有很高的价值的。

跑题了,我们把话题拉回来。为了大家能够对我们实现的功能有一个感性的认识,我现在把我们应用涉及的两个Web Page的Screen Shot先展示给大家。

Order.aspx: 列出所有的Order记录,Order No.为一个Link,通过它Redirect 到OrderDetail.aspx。

 


OrderDetail.aspx:列出当前Order的详细信息。

 

我们现在就开始来一步一步得来实现这个简单的应用。Source Code这里下载

1. 建立一个Website,下面的这个Website的结构。

 

  • Utility.cs: 提供一个Common的方法通过SQLXML从Database中查询数据。
  • Schema/Order.xsd: 这是一个被称为Mapping Schema的XSD。在SQLXML,Mapping Schema是最为重要的对象,因为所有基于SQLXML的操作都是建立在Database中的数据结构和XML有一个完全Mapping的基础上的,而这样的Mapping 就是通过Mapping Schema来实现的。
  • Template/Order_Sql.xml &Template/Order_Xpath.xml: SQLXML查询允许我们把查询的条件通过不同的方式传递到SqlXmlCommand(这个对象和ADO.NET忠德DbCommand有点相似,用于执行所有的Data Access 操作)——可以一纯字符串的形式;可以一Stream的形式;可以把它们保存在一个Tenplate文件中,通过这个文件传递。本例就是采用最后一种方式。在这个例子中,我们会以两种不同的方式来实现数据的查询——通过For XML Select语句和通过Mapping Schema 结合Xpath。
  • Transform/Order.xsl & Transform.OrderDetail.xsl:由于SQLXML获取的数据实际上是一个纯XML,但是我们希望把数据在Web Page中显示出来。所以我们需要通过这两个XSLT把XML转化成相应的HTML。
  • Order.css:应用于Web Page的Css,使得页面看上去相对好看一点。
  • Order.aspx & OrderDetail.aspx:Web Page。

2. 创建Mapping Schema

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:sql="urn:schemas-microsoft-com:mapping-schema"     
       xmlns:xs
="http://www.w3.org/2001/XMLSchema">
  
<xs:annotation>
    
<xs:appinfo>
      
<sql:relationship name="order_orderdetail" parent="T_ORDER" parent-key="ORDER_ID" child="T_ORDER_DETAIL" child-key="ORDER_ID" >
      
</sql:relationship>
    
</xs:appinfo>
  
</xs:annotation>
  
<xs:element sql:relation="T_ORDER" name="order" type="orderType" />
  
<xs:complexType name="orderType">
    
<xs:sequence>
      
<xs:element sql:relation="T_ORDER_DETAIL" sql:relationship="order_orderdetail" name="product" type="productType" />
    
</xs:sequence>
    
<xs:attribute sql:field="ORDER_ID" name="id" type="xs:int" />
    
<xs:attribute sql:field="ORDER_DATE" name="date" type="xs:dateTime" />
    
<xs:attribute sql:field="SUPPLIER" name="supplier" type="xs:string" />
  
</xs:complexType>
  
<xs:complexType name="productType">
    
<xs:attribute sql:field="PRODUCT_ID" name="id" type="xs:int" />
    
<xs:attribute sql:field="PRODUCT_NAME" name="name" type="xs:string" />
    
<xs:attribute sql:field="PRODUCT_NAME" name="price" type="xs:double" />
    
<xs:attribute sql:field="QUANTITY" name="quantity" type="xs:int" />
  
</xs:complexType>
</xs:schema>

Mapping Schema是一个XSD,他实现了如何把数据库中的对象(比如一个表,一个字段,甚至表与表之间的关联)Mapping到XML中的某一格Element或者Attribute中。所有Mapping相关的Tag定义在这样一个Namespace中——urn:schemas-microsoft-com:mapping-schema。通过relationship实现了T_ORDER和T_ORDER_DETAIL之间的关联。通过relation把两个表Mapping到一order和product XML Element上,通过field把数据库中相关的字段Mapping到对应的XML Attribute上。仔细分析,上面的XSD实际上是定义了下面一种结构。

<?xml version='1.0' encoding="utf-8" ?>
<orders xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  
<order id="1" date="2007-03-21T00:00:00" supplier="Dell Coporation">
    
<product id="1" name="PC" price="7000" quantity="25"/>
    
<product id="2" name="Laptop" price="13000" quantity="50"/>
  
</order>
  
<order id="2" date="2007-03-23T00:00:00" supplier="HP Coporation">
    
<product id="3" name="PC" price="8000" quantity="30"/>
    
<product id="4" name="Printer" price="3000" quantity="5"/>
  
</order>
  
<order id="3" date="2007-03-25T00:00:00" supplier="AA Coporation">
    
<product id="5" name="Pencil" price="0.4" quantity="3000"/>
  
</order>
</orders>
0
相关文章