欢迎光临
我们一直在努力

使SQL数据支持XML-.NET教程,XML应用

建站超值云服务器,限时71元/月

如果你在it业工作,那么你很可能听说过xml;但如果你的工作主要与sql server有关,那么你可能并没有直接运用过xml。xml已经是web编程环境中的普遍的数据格式了,而且它也是.net framework中主要的底层技术之一。sql server以两种方式来支持xml:通过sql server本身的功能,以及通过发布称为sqlxml的额外的功能。sqlxml扩展了sql server,并提供了xml兼容性。在本月的专栏中,我将讲述sql server对xml的内置的支持,并讲述通过发布sqlxml而增加的一些功能(见 图1)。sql server支持xml就意味着,我们可以更有效地更新和读取数据了;我们不再需要将xml数据转换成数据库可以理解的另一种格式,或将xml数据从数据库转换成xml。而且,可供开发人员选择的方法也更多了,就是说,他们在访问数据方面更灵活了。

对xml的宣传已经有很多了,所以重要的一点是要意识到它只是一门简单的技术。本质上,它是用来描述数据的一个标准的文件格式。(有关xml基础知识的更多的信息,请参阅工具条“xml 101”。)从发布sql server 2000的最初版本以来,对xml的支持就已经是sql server的一部分了。sql server不是通过提供一个方法保存xml文件来支持xml的,而是提供了一个到关系数据的接口,使你可以在表和其它数据库对象中读写xml数据。sql server所固有的xml功能包括:可以通过http、模板查询、for xml子句和openxml()函数来访问sql server。接下来,我将讲述这些功能是如何运作的,以及它们可以如何使你的企业受益。

图1. 提供 xml支持

要通过http访问一个sql server数据库,你必须首先设置一个虚拟目录。这个虚拟目录在http协议和一个特定的数据库之间提供了一个链接。设置虚拟目录时,我们需要用“configure sql xml support in iis”菜单条目,你可以在window的start菜单中的sql server菜单条目找到该项。通过该菜单条目,你就可以指定虚拟目录的名称、物理路径、服务器名称、数据库名称和注册信息。一旦你创建了一个虚拟目录,你就可以通过一个url将查询发送到数据库了。如果你设置了一个叫做northwind的虚拟目录,并在浏览器中输入了查询http://localhost/northwind?sql=select+*+from+shippers+for+xml+auto,elements+&root=shippers,它就会返回类似于“xml 101”工具条中的shippers例子中的xml数据。与运用ado或其它任何技术相比,http查询会让我们更容易地来访问网站或web应用程序的数据。

对于一个简单的查询语句来说,http查询会很好,但对于一个更复杂的查询来说,这种格式就会变得难以理解并很难管理了。这种方法也不安全,因为查询源代码是暴露给用户的。另外一种可选方法是在http上调用一个模板查询。一个模板查询就是一个包含sql查询的xml文件。模板作为文件保存在服务器上。因此,如果你在一个叫做getshippers.xml的模板中封装了shippers select查询,那么url查询的形式就会是:http://localhost/northwind/templates/getshippers.xml。模板也可以带有参数,当你的模板调用一个存储过程时,该功能会很有用。在url查询和模板查询中,如果你想从查询返回一个html页面,那么你可以指定一个xslt样式表,将它用于xml。模板查询是读取数据的一个更安全的方法,它可以被缓存以得到更好的性能。

你也可以用for xml子句将数据读取成xml格式,该方法从sql server表中返回数据,你可以把它们看做是xml数据。你可以在一个select语句中运用for xml子句,它有三种模式可以以不同的格式来返回xml:raw、auto和explicit。raw模式将结果中的每个记录作为一个普通的行元素来返回,它被包含在一个<row/>标签中,并将每个列的值作为一个属性。auto模式将每个记录作为行元素返回,根据源表或视图对它进行命名。如果查询从一个表返回多个列,那么每个列的值就会被作为表元素的属性来返回。但最重要的是,如果你的select语句执行了合并操作,那么auto模式就代表的是子行,它们作为元素嵌套在父行下。explicit模式有几个参数,你可以通过这些参数完全定义返回的xml的样式。你可以为每个元素定义标签,明确确定数据是如何嵌套的。for xml语句使我们不必再返回一个rowset,然后在客户端或中间层将它转换成xml了。

openxml函数可以让你像操作一个表那样来运用xml数据,可以将它们转换成内存中的一个rowset。要运用openxml,首先要调用sp_xml_preparedocument存储过程,实际上,它将xml解析成一个数据树,并将那个数据的句柄传递到openxml函数。然后你就可以操作那个数据了:进行查询、将它插入到表中、等等。openxml函数可以带有三个参数:用于xml文档内部显示的句柄、一个rowpattern参数和一个flags参数。rowpattern参数指定了应该返回原始的xml文档中的哪些节点。flags参数指定了以属性为中心的映射(结果集中列名符合属性名)或以元素为中心的映射(结果集中列名符合元素名)。在处理完xml数据后,我们可以调用sp_xml_removedocument将xml数据从内存中删除。

通过sqlxml得到更多的支持

通过发布sqlxml(也被称为web版),microsoft也在sql server中提供了更多的xml支持。已经有三个sqlxml的版本了,它们包含的一些额外的功能有updategram和xml bulk load。你可以在线下载最新的版本sqlxml 3.0(见资源)。你可以通过基于xml的模板,运用updategram来插入、更新或删除表中的数据。该模板有一个before block,它描述了记录更新前的当前状态;还有一个after block,它描述了记录的变化。下面就是updategram的一个例子,它修改了shippers表中的一个公司的phone字段:<updg:sync >

<updg:before>

<shippers shipperid="3" />

</updg:before>

<updg:after>

<shippers phone="(503) 555-0108" />

</updg:after>

</updg:sync>

在缺省情况下,updategrams认为before block和after block中的字段指的是表和列。但updategrams也可以用一个mapping schema。mapping schema将一个xml文档中的元素与一个表中的元素关联了起来。如果在上面的模板中,你引用属性名sid,而不是shipperid,那么mapping schema就会将sid映射到shipperid列。你可以通过http(同模板查询一样)或通过ado将updategrams发送到sql server。它们也可以被参数化,带有输入值。updategrams提供了一个方法,使我们可以直接从xml更新sql server数据,这样就不用从xml文档得到数据,然后再用一个记录集或调用一个存储过程了。updategrams只是可以简单地插入、更新或删除数据,所以如果你需要查看一个值是否存在、或在更新前查看一些商业规则,那么你就应该用openxml。

虽然你可以用openxml函数和updategrams来插入数据,但对于加载大量的xml数据来说,这两种方法都不实用。你应该用xml bulk load将大量的xml数据插入到sql server表中。实际上,我们是用sqlxmlbulkload组件来加载数据的,你可以从一个客户端应用程序来调用这个组件。在建立到数据库的连接后,bulk load组件需要一个路径来访问mapping schema,从而将xml属性和元素映射到数据库对象,而且还需要路径来访问一个xml文档或一个xml流。在bulk load组件中,你可以指定是否执行数据表检查约束(check constraint)、是否忽略通过复制键添加的记录、当插入数据时,是否应该锁定数据表,等等。

缺省情况下,大量加载不是事务处理型(transactional)的,所以如果出现错误,截止到错误点前插入的数据就会保留在数据库中。你可以指定所有加载的数据都是在一个单独的事务处理过程中的,因此该过程要么会十分成功,要么会回滚。如果你用了事务处理,所有的数据在插入前都会被写进一个临时的文件。这就意味着,你需要足够的磁盘空间来保存临时文件,而且加载数据可能会相当慢。xml bulk load给我们提供了一个很好的方法,使我们可以将大量的数据写到sql server中;否则,你就必须提取数据,然后用另外的方法将它加载到你的数据库中。

你也可以配置sql server来缓存xslt样式表、模板和mapping schema,从而得到更好的性能。根据具体实现情况,你可以在web应用程序中用通过http和xslt的xml查询来替代标准的asp/ado数据访问,从而得到html输出结果,这种方法可以极大地提高性能。

以上就是sql server对xml的一些高级支持。不管我们对它的宣传有多少,xml的功能就这么多了。因为xml是用来显示数据的一个标准,也是用于.net的数据传输技术,因此,xml与sql server的集成能力就会是企业需要解决的一个重要的问题。

关于作者:

dianne siebold是san diego一家软件公司的商业分析主管,也是位专门从事vb和sql server开发的程序员。她是vsm的定期撰稿人,也是visual basic developer’s guide to sql server (sybex,2000)一书的作者。她的联系方式是dsiebold@earthlink.net。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 使SQL数据支持XML-.NET教程,XML应用
分享到: 更多 (0)