通过ADO.NET返回XML
在提供的可下载的示例代码中还包含了一个用于运行某些代码示例(如图 4所示)的ASP.NET项目。该项目示例使用一个叫做GetFORXML的方法,该方法运行任何SQL时都附带一个FOR XML子句,并将得到的XML写到一个文件。为简单起见,该XML还被包装在一个<root>元素中。
图 5所示的GetFORXML方法代码说明了如何使用标准SqlCommand对象来执行包含FOR XML子句的SQL语句。这里使用了ExecuteXmlReader方法,因此可以将XML作为一个XmlReader对象返回。数据集的ReadXml方法接受XmlReader,其第二个参数表明该XML是一个片段。
|
图 5 使用XmlTextReader遍历XML
因为它是一个片段,所以如果它有一个用于匹配的架构,则只加载所有的Customer节点。因此在加载XML之前,先使用ReadXmlSchema方法加载该架构(在这种情况下需要推理)。最后,将该数据集的DataSetName属性设置为“root”,这样将得到封闭在一个父标记<root/>中的读XML。
图 4中的ASP.NET页能够执行和输出前面已经研究过的例子的XML,也能够使用FOR XML RAW, BINARY BASE64获取员工数据 。此外,通过使用以下子句,它还能够执行和输出XML,获取客户和定单数据:
|
使用FOR XML限制
FOR XML AUTO和FOR XML RAW 对返回二进制数据都不提供完全支持。例如,若选择一个二进制字段(比如 Employees.Photo列)并使用FOR XML RAW,则会收到一条难以处理的错误消息。避免这种情况的一种方法是将一个URL返给二进制数据字段。这就需要首先在IIS中建立一个SQL Server虚拟目录。另一种方法不需要进行IIS配置,它是在FOR XML子句中指定BINARY BASE64选项,如以下代码所示:
|
这样SQL Server就会使用BASE64格式来格式化二进制数据。其优点是SQL语句将不再改变。缺点是读取使用BINARY BASE64的查询结果不方便。下面的XML是使用BINARY BASE64时所返回的结果的一个例子。这里削减了Photo属性的内容,因为其长度超过了14,000个字符!
|
FOR XML AUTO模式的另一个限制是它不支持GROUP BY子句或聚合函数。不过,可以通过选择若干行、构成TABLE变量,然后使用FOR XML AUTO子句从该中间表中检索这些行来避开这种限制。下面的SQL代码即可完成这一任务:
|
