成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談如何使用.NET存儲XML數據

開發
SQL Server 2000和XML for SQL Server 2000 Web版本(SQLXML)提供了三種存儲XML數據的途徑:XML Bulk Load和Updategrams,本文將談談如何使用.NET存儲XML數據。

XML Bulk Load和Updategrams,這兩種客戶端技術使用帶有注解的大綱指定XML文檔內容和 數據庫的表之間的映射;OpenXML是一種服務器端技術,它允許你在XML文檔上定義關系視圖, 有了OpenXML的關系視圖,你就能使用T-SQL代碼查詢XML文檔中的數據并把結果存儲在你的SQL Server數據庫中。

這三種技術中的每一種都是為特定的目的設計的。XML Bulk Load把來自 很大的XML文檔的數據存儲在SQL Server中;Updategrams執行SQL Server數據的優化更新(優 化更新是沒有鎖(lock)的更新,在這種更新中系統檢測是否有其它用戶在原來讀取數據后改 變了它);OpenXML提供了人們熟悉的XML數據關系訪問方法。

在這三種技術中,OpenXML是最靈活的,因為它提供了一個編程模型(T-SQL), 在把XML數據存儲在SQL Server數據庫之前,你可以使用這種編程模型在XML數據上編寫業務規 則或執行計算邏輯。但是,由于OpenXML是一種基于服務器的技術,如果你頻繁的使用它或者有 大量的文檔,它會降低SQL Server的性能。不過,如果你采用了微軟.NET框架組件,你就可以 使用ADO.NET的數據集繞開這些性能和可伸縮性方面的限制,ADO.NET數據集賦予你一個強大的 技術--為把XML數據存儲在SQL Server包含了一個完整的編程模型。

數據集、數據表和XML映射

你可以使用數據集簡單地從SQL Server中生成XML查詢結果。通過提供一種可以在客戶端和 中間層計算機上使用的關系數據緩存(cache),數據集能夠載入和維護多種數據源(包括SQL Server、其它的關系型數據庫和XML)中的數據。

當你從XML文檔中載入一個數據集的時候,該數據集必須把存儲在層次XML表現 (representation)中的數據映射成數據集的關系表現。例如,如果你的XML文檔包含一個 Order元素列表,而它又有一個作為子元素的嵌套的LineItem元素,那么通常這個文檔被映射成 關系表現中的Orders和LineItems數據表。這種映射的目的與OpenXML使用Xpath查詢構造XML文 檔上的關系視圖的方法的目的是一樣的。但是與使用Xpath規范不同,數據集有自己的映射數據 的方式。

數據集使用XML大綱定義(XSD)大綱把數據從XML文檔映射到數據集的關系數據緩存中。數 據集為你提供了指定映射XML數據的大綱的兩種方法。首先,你可以引用一個定義了XML文檔中 使用的元素,屬性和關系的XSD大綱。另一種方法是,你可以直接從文檔的結構中推理大綱。換 句話說,數據集可以通過檢查XML文檔的結構和內容建立大綱。

當你引用XSD大綱的時候,數據集使用這個大綱中定義的元素、屬性與元素之間的關系來構 造關系數據緩存中的數據表、數據列和數據關系,你可以使用這個數據緩存存儲被映射的XML數 據。我談到關系數據緩存中的結構或大綱的時候,一般把它稱為數據緩存的形式。當數據集處 理大綱的時候,它會應用一組規則,這種規則與映射大綱中沒有指定注解時Updategrams 和XML Bulk Load使用的默認映射規則相似,數據集使用這種規則建立數據集用于存儲被映射的XML數 據的表。數據集的映射規則概述如下:

◆復合元素--即包含其它元素或屬性的元素--被映射成表。

◆屬性和簡單值(simple-valued)子元素--只包含數據,不包含其它元素或屬性的元素-- 被映射成列。

◆數據類型從XSD類型映射為.NET類型。 

推理(Inference)是一種快速、方便的把XML文檔載入數據集的方法。表、列和關系都是" 自我測量"(introspection)自動建立的,"自我測量"是數據集檢查XML文檔的結構和內容的過 程。盡管使用推理明顯減少了你的編程負擔,但是它也給你的實現帶來了不可預測性,因為對 XML文檔的很小的改動可能引起數據集建立不同形式的表。這些形式的改變可能引起你的應用程 序意外中斷。因此,我推薦你一般為應用程序引用一個大綱,建立原型的時候限制推理的使用 。

現在讓我們看一看如何使用大綱建立一個可用于更新SQL Server數據庫的客戶端數據集數據 緩存的例子。 

映射XML訂單

假定你在編寫一個接受用戶訂單的應用程序,訂單是XML格式的,它的XSD 大綱如圖1定義。該大綱定義了三種復合類型,分別提供訂單的客戶數據、訂單數據和線性數據 項。一個頂層Customer元素定義了XML文檔的根。這個封閉的系統定義了元素之間的關系: Order元素包含了一個LineItem元素,Customer元素包含一個Order元素。圖2顯示了符合圖1定 義的大綱的一個XML文檔實例。

圖1:XSD大綱

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:Sep2003Example" elementFormDefault="qualified"
xmlns="urn:Sep2003Example"
xmlns:xs=" <xs:complexType name="OrderType">
 <xs:sequence>
<xs:element name="OrderID" type="xs:integer" />
<xs:element name="LineItem" type="LineItemType" />
 </xs:sequence>
</xs:complexType>
< xs:complexType name="LineItemType">
 <xs:sequence>
<xs:element name="ProductID" type="xs:int" />
<xs:element name="Quantity" type="xs:int" / >
<xs:element name="UnitPrice" type="xs:decimal" />
 </xs:sequence>
</xs:complexType>
<xs:complexType name="CustomerType">
 <xs:sequence>
<xs:element name="CustomerID" type="xs:string" />
<xs:element name="Order" type="OrderType" />
 </xs:sequence>
</xs:complexType>
<xs:element name="Customer" type="CustomerType">
</xs:element>
</xs:schema>

圖2:一個XML文檔示例

<?xml version="1.0" ?>
 <Customer xmlns="urn:Sep2003Example">
< CustomerID>ALFKI</CustomerID>
<PO>9572658</PO>
<Address>
<Street >One Main Street</Street>
<City>Anywhere</City>
<State>NJ</State>
<Zip>08080</Zip> </Address>
<Order>
 <OrderID>10966</OrderID >
 <LineItem>
<ProductID>37</ProductID>
<UnitPrice>26.50 </UnitPrice>
<Quantity>8</Quantity>
<Description>Gravad lax </Description>
 </LineItem>
 <LineItem>
<ProductID>56 </ProductID>
<UnitPrice>38.00</UnitPrice>
<Quantity>12</Quantity>
<Description>Gnocchi di nonna Alice</Description>
 </LineItem>
</Order>
 </Customer>

列表1中顯示的C#代碼使用ReadXmlSchema方法把圖1中的大綱載入一個叫作orderDS的數據集 中。ReadXmlSchema建立了三個數據表,它們分別與大綱中定義的Customer、Order和LineItem 元素對應。因此你可以驗證這個大綱在關系數據緩存中建立了預期的表,printDSShape方法把 每個表的名稱寫到控制臺上,后面跟著列的列表和每列的數據類型。

列表1: 建立關系數據緩存的C#代碼

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Xml;

public class XMLMap
{
public static void Main()
{// 建立數據集和讀取大綱
DataSet orderDS = new DataSet ("CustOrder");
orderDS.ReadXmlSchema("CustOrderLitem.xsd");

// 打印數據集的形式
printDSShape(orderDS);

// 把一個XML格式的訂單讀入數據集
orderDS.ReadXml ("Order.xml",System.Data.XmlReadMode.IgnoreSchema);

// 打印數據集中的數據
printDSData(orderDS);

// 此處插入業務規則和數據庫更新邏輯
}

private static void printDSShape(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("{0}",dt.TableName);

// 打印列的名稱和類型
foreach (DataColumn dc in dt.Columns)
Console.WriteLine("\t{0}\t{1}",dc.ColumnName,dc.DataType.ToString());
} }

private static void printDSData(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{Console.WriteLine("\n{0}:", dt.TableName);

// 打印列的頭
foreach (DataColumn dc in dt.Columns)
Console.Write("{0} \t",dc.ColumnName);
Console.WriteLine("");

// 輸出數據
foreach (DataRow dr in dt.Rows)
{
foreach(DataColumn dc in dt.Columns)
System.Console.Write("{0}\t",dr[dc]);
System.Console.WriteLine ("");
}}}}

仔細查看一下列的名稱。盡管大綱中沒有指定Customer_Id和Order_Id列,但是它們還是出 現在數據表中。ReadXmlSchema給數據集自動添加這些列。數據集把這些列用作外部鍵 (foreign key),以模擬Customer元素與它的Order元素之間、Order元素與它的LineItem元素 之間的關系。因為典型情況下XML使用嵌套的關系代替了外部鍵,所以數據集自動生成自己的主 鍵、數據表之間的外部鍵,并把它們存儲在這些列中。

請同時仔細查看圖3中的數據類型--數據集已經把來自XML大綱數據類型的數據類型映射為對 應的.NET數據類型。當你把XML文檔載入數據集的時候,該數據集把來自XML的每一個值轉換為 對應的.NET類型。

圖3:生成的數據類型和記錄

Customer
CustomerID System.String
Customer_Id System.Int32

Order
OrderID System.Int64
Order_Id System.Int32
Customer_Id System.Int32

LineItem
ProductID System.Int32
Quantity System.Int32
UnitPrice System.Decimal
Order_Id System.Int32

Customer:
CustomerID Customer_Id
ALFKI 0

Order:
OrderID Order_Id Customer_Id
10966 0 0

LineItem:
ProductID Quantity UnitPrice Order_Id
37 8 26.5 0
56 12 38 0

把大綱載入數據集之后,為了完成關系映射,你需要做的所有事情就是把XML數據載入該數 據集。列表1的ReadXml方法打開叫作Order.xml的文件,該文件如圖2所示。接著,它把文件中 的數據讀取到你剛才讀取大綱建立的數據集中的數據表里。你的XML訂單現在可以通過數據集訪 問了。

為了演示如何訪問數據集中的數據,列表1的printDSData方法在數據表中導航,對于每張表 ,都顯示列的名稱,緊接著顯示這張表的所有的行。圖3顯示為ReadXmlSchema方法給數據集添 加的Customer_Id和Order_Id列自動生成了值。

請注意,Order.xml出現的三個元素--PO、Address和Description--沒有映射到數據表中。 這些數據被忽略了,因為你提供給數據集的大綱沒有包含這些元素,當數據集建立關系數據緩 存的外形并載入XML數據的時候,它簡單地忽略了沒有在大綱中描述的數據。即使在你從客戶那 兒接收到的XML訂單中包含了沒有預料到的額外數據,這種簡便特性也可以讓你的代碼正常地工 作。

建立使用數據緩存的應用程序

現在你已經知道如何使用數據集為XML數據建立關系數據緩存了,你可以應用這種技術來實 現一個執行業務邏輯并更新SQL Server的應用程序。當你使用數據集編程模型的時候實現業務 邏輯相對直接。ADO.NET為你提供了更新SQL Server中數據的幾種選擇,包括使用數據適配器、 編寫自己的查詢,以及執行存儲過程。數據集使把XML數據映射成關系模型很容易,剩余的事情 是你的了。

【編輯推薦】

  1. 淺談如何將Oracle導出到XML文件
  2. 詳解Java解析XML的四種方法
  3. 數據庫中的pureXML優點介紹

責任編輯:彭凡 來源: blog.ikugo.cn
相關推薦

2009-07-28 17:34:28

ASP.NET XML

2009-06-22 11:52:00

javascriptxml

2009-07-23 15:44:39

ASP.NET MVC

2011-01-28 09:45:29

ASP.NET MVC

2009-07-20 17:12:17

ASP.NET訪問數據

2009-10-16 10:14:26

VB.NET使用Fil

2009-07-14 11:51:00

XML壓縮

2009-08-19 10:54:42

ASP.NET數據訪問

2009-07-22 17:21:27

ASP.NET 2.0

2009-07-28 14:40:15

XML數據ASP.NET

2009-11-11 11:19:57

ADO.NET使用

2009-09-22 13:41:10

直接使用Hiberna

2009-08-03 18:47:12

ASP.NET數據緩存

2009-04-14 09:24:40

OracleXML導出

2009-09-08 16:55:01

Linq實現XML轉換

2011-07-20 14:04:42

.NET策略模式

2009-09-14 15:45:28

LINQ刪除XML節點

2009-11-03 15:13:13

ADO .NET存儲過

2009-01-16 13:17:16

AjaxASP.NET.NET

2009-06-26 10:48:45

職責鏈模式.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费高清成人 | 欧美国产视频一区二区 | 天天影视网天天综合色在线播放 | 久久国产精品一区二区三区 | 久久看精品 | 日韩国产中文字幕 | 日本大片在线播放 | 日韩精品视频在线 | 日本一区二区在线视频 | 91麻豆精品国产91久久久久久 | 欧美日韩高清一区 | 国产成人a亚洲精品 | 综合久久色 | 日本特黄a级高清免费大片 特黄色一级毛片 | 丝袜毛片| 日日草天天干 | 欧美a视频 | 免费av手机在线观看 | 国产成人精品免费 | 精品成人佐山爱一区二区 | 国产一区二区三区色淫影院 | 美女三区| 日本久久黄色 | 奇米影视首页 | 国产在线一区二区三区 | 欧美成视频 | 久久99精品久久久久久青青日本 | 日日夜夜操天天干 | 日本黄色的视频 | 久久大陆 | 美日韩免费视频 | 在线观看 亚洲 | 亚洲综合字幕 | 色www精品视频在线观看 | 亚洲成人精选 | www.天天操.com| 九九伦理电影 | 国产精品精品久久久 | 超碰免费在线观看 | 99精品欧美一区二区三区综合在线 | 久久另类视频 |