通过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遍历XMLprivate string GetFORXML(string sFile, string sSQL) {
// Create和open the connection to Northwind
using(SqlConnection oCn = new SqlConnection(this.sCnNW)) {
oCn.Open();
![]()
// Create the SQL command to execute
SqlCommand oCmd = new SqlCommand(sSQL, oCn);
![]()
DataSet oDs = new DataSet();
![]()
// Execute the SQL statement and return the data to an XmlReader.
// Then read the schema and the fragment
XmlReader oXml = oCmd.ExecuteXmlReader();
oDs.ReadXmlSchema(oXml);
oDs.ReadXml(oXml, XmlReadMode.Fragment);
![]()
oCn.Close();
![]()
oDs.DataSetName = "root";
oDs.WriteXml(this.sPath + sFile);
return "Wrote XML to file " + sFile;
}
}
因为它是一个片段,所以如果它有一个用于匹配的架构,则只加载所有的Customer节点。因此在加载XML之前,先使用ReadXmlSchema方法加载该架构(在这种情况下需要推理)。最后,将该数据集的DataSetName属性设置为“root”,这样将得到封闭在一个父标记<root/>中的读XML。
图 4中的ASP.NET页能够执行和输出前面已经研究过的例子的XML,也能够使用FOR XML RAW, BINARY BASE64获取员工数据 。此外,通过使用以下子句,它还能够执行和输出XML,获取客户和定单数据:
FOR XML RAW
FOR XML AUTO
FOR XML AUTO, ELEMENTS
FOR XML AUTO, ELEMENTS, XMLDATA