深入探索SQLServer2000与ASP.NET中的XML应用
立即解锁
发布时间: 2025-08-17 01:16:14 阅读量: 1 订阅数: 3 


ASP.NET与XML开发指南
### 深入探索 SQL Server 2000 与 ASP.NET 中的 XML 应用
#### 1. 数据展示与转换基础
在 XML 文档中,特定客户关联的所有订单可自动作为子元素显示,这便于使用 XSLT 匹配每个订单并输出所需数据。通过设置 `DataRelation` 对象的 `Nested` 属性为 `true`,可实现嵌套元素,例如将订单置于下单客户之下,订单关联的不同产品置于订单之下。
利用 `XmlDataDocument` 类和 XSLT,可将 `DataSet` 转换为其他结构,如 HTML。具体操作是将 `DataSet` 传入 `XmlDataDocument` 的构造函数,再将结果对象传入 `XslTransform` 类的 `Transform()` 方法。
#### 2. SQL Server 2000 的 XML 特性
SQL Server 2000 具备众多与 XML 相关的新特性,可对关系型和 XML 数据执行多种任务,能将关系型数据以自定义方式描述和构造为 XML。其特性包括:
- 通过 HTTP 使用 `QueryString` 中的查询检索 SQL Server 2000 生成的 XML 数据,也可调用存储在 Web 服务器上的 XML 模板返回 XML 数据。
- 使用 `SELECT` 命令和 `FOR XML` 关键字从 ASP.NET 页面、调用存储过程或使用 XPath 查询检索 XML 数据。
- 全面支持 XML Data - Reduced (XDR) 模式,也提供对 XSD 模式的测试版支持,可将各种 XML 元素和属性映射到表和字段。
- 使用 `OPENXML` 行集提供程序“拆分”XML 文档以执行插入操作。
- 通过发送称为 `UpdateGrams` 的特殊格式化 XML 文档完成更新、插入和删除数据库记录操作。
#### 3. 使用 HTTP 查询 SQL Server 2000
#### 3.1 配置 SQL Server 虚拟目录
要使用 HTTP 查询 SQL Server 2000,需先配置 Internet Information Services (IIS) 以支持 SQL Server 2000 HTTP 查询,具体步骤如下:
1. 进入“开始” - “程序” - “Microsoft SQL Server” 程序组,选择“Configure SQL XML Support in IIS” 选项。
2. 打开默认 Web 服务器,右键单击,选择“新建” - “虚拟目录”。
3. 输入虚拟目录的别名和物理位置,如使用别名 `Northwind`,物理路径指向 `wwwwroot` 文件夹中的 `Northwind` 目录。
4. 点击“安全”选项卡,输入正确的用户 ID 和密码信息,可指定 Windows 或 SQL Server 账户类型,也可使用 Windows 集成安全。
5. 点击“数据源”选项卡,提供 SQL Server 2000 机器名称和服务器内的相应数据库,如使用 `Northwind` 数据库。
6. 点击“设置”选项卡,根据实际需求选择选项以锁定虚拟目录对数据库的访问。
7. 点击“虚拟名称”选项卡,可关联模板、模式和 `dbobjects`,点击“新建”按钮,输入虚拟名称(如 `Templates`),选择类型为 `Template`,指定 XML 模板的存储路径,点击“保存”。
8. 点击“确定”创建 SQL Server 2000 虚拟目录。
#### 3.2 使用 `FOR XML` 关键字查询
使用创建的虚拟目录,可将 SQL 查询放入 URL 对 `Northwind` 数据库执行查询。例如:
```plaintext
http://localhost/Northwind?sql=SELECT+*+FROM+Customers+WHERE+CustomerID=‘ALFKI’+FOR+XML+AUTO&root=root
```
该 URL 会返回如下 XML 文档:
```xml
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Customers CustomerID="ALFKI" CompanyName="New Name" ContactName="Maria Anders" ContactTitle="Sales Representative" Address="Obere Str. 57" City="Berlin" PostalCode="12209" Country="Germany" Phone="030-0074321" Fax="030-0076545"/>
</root>
```
此 URL 中,`Northwind` 虚拟目录路径后是要执行的 SQL 查询,查询被设置为 `QueryString` 参数 `sql` 并进行 URL 编码。`FOR XML AUTO` 关键字用于以 XML 形式返回数据,`AUTO` 关键字使数据库返回允许元素嵌套的 XML 文档,`root` 参数用于命名返回的 XML 文档的根元素。
若不希望客户和订单之间有嵌套,可使用 `RAW` 关键字,结果会将所有字段分组到一个 XML 元素“row”结构中。
#### 3.3 URL 编码 SQL 查询
随着 HTTP 查询变得复杂,手动进行 URL 编码较为困难,可使用 ASP.NET `Server` 对象的 `UrlEncode()` 方法简化此过程。以下是示例代码:
```html
<html>
<head>
<script language="c#" runat="server">
void SubmitButton_Click(Object Src, EventArgs E) {
String sql = sqlBox.Text;
String root = txtRoot.Text;
if (root.Length == 0) root = "root";
if (sql.Length > 0) {
String encodedSql = Server.UrlEncode(sql);
if (rdoChoice.SelectedIndex == 0) {
lblErrors.Text = encodedSql;
} else {
lblErrors.Text = "";
Response.Redirect(@"http://localhost/northwind?sql=" + encodedSql + "&root=" + root);
}
} else {
lblErrors.Text = "You did not enter a SQL query.";
}
}
</script>
</head>
<body bgcolor="#ffffff">
<form runat="server">
<asp:Label id="lblErrors" style="font-family: arial;font-weight: bold;color: red" runat="server"/>
<p/>
<span style="font-family:arial;font-weight:bold;">Root Name: </span>
<asp:TextBox id="txtRoot" runat="server"/>
<p/>
<span style="font-family:arial;font-weight:bold;">SQL Query: </span>
<br/>
<asp:TextBox id="sqlBox" Text="" Height="300px" Width="600px" TextMode="MultiLine" Wrap="true" runat="server"/>
<p/>
<asp:RadioButtonList style="font-family:arial;" id="rdoChoice" RepeatDirection="Vertical" runat="server">
<asp:ListItem Selected="true">Return Encoded SQL</asp:ListItem>
<asp:ListItem>Execute SQL Statement</asp:ListItem>
</asp:RadioButtonList>
<p/>
<asp:Button id="submitbutton" text="Run Query" OnClick="SubmitButton_Click" runat="server"/>
</form>
</body>
</html>
```
#### 3.4 将 XML 数据加载到类中
可将 SQL Server 2000 的数据直接加载到 `XPathDocument` 类和 `DataSet` 类中。
加载到 `XPathDocument` 类的示例代码如下:
```asp
<%@ Import Namespace="System.Xml.XPath" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<script language="C#" runat="Server">
void Page_Load(object sender, EventArgs e) {
string sql = Server.UrlEncode(@"SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderID, Orders.CustomerID FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID FOR XML AUTO");
string url = "http://localhost/northwind?sql=" + sql + "➥&root=Northwind";
try {
XPathDocument xmlDoc = new XPathDocument(url);
XslTransform xslDoc = new XslTransform();
xslDoc.Load(Server.MapPath("customers.xsl"));
xslDoc.Transform(xmlDoc,null,Response.Output);
}
```
0
0
复制全文