色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

使用.NET存儲XML數(shù)據(jù)的方法

SQL Server 2000和XML for SQL Server 2000 Web版本(SQLXML)提供了三種存儲XML數(shù)據(jù)的途徑:XML Bulk Load和Updategrams,這兩種客戶端技術使用帶有注解的大綱指定XML文檔內容和數(shù)據(jù)庫的表之間的映射;OpenXML是一種服務器端技術,它允許你在XML文檔上定義關系視圖,有了OpenXML的關系視圖,你就能使用T-SQL代碼查詢XML文檔中的數(shù)據(jù)并把結果存儲在你的SQL Server數(shù)據(jù)庫中。 
  這三種技術中的每一種都是為特定的目的設計的。XML Bulk Load把來自很大的XML文檔的數(shù)據(jù)存儲在SQL Server中;Updategrams執(zhí)行SQL Server數(shù)據(jù)的優(yōu)化更新(優(yōu)化更新是沒有鎖(lock)的更新,在這種更新中系統(tǒng)檢測是否有其它用戶在原來讀取數(shù)據(jù)后改變了它);OpenXML提供了人們熟悉的XML數(shù)據(jù)關系訪問方法。 

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

  數(shù)據(jù)集、數(shù)據(jù)表和XML映射 

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

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

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

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

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

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

  ? 數(shù)據(jù)類型從XSD類型映射為.NET類型?!?nbsp;

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

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

映射XML訂單 

  假定你在編寫一個接受用戶訂單的應用程序,訂單是XML格式的,它的XSD大綱如圖1定義。該大綱定義了三種復合類型,分別提供訂單的客戶數(shù)據(jù)、訂單數(shù)據(jù)和線性數(shù)據(jù)項。一個頂層Customer元素定義了XML文檔的根。這個封閉的系統(tǒng)定義了元素之間的關系: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="http://www.w3.org/2001/XMLSchema"> 
?。紉s:complexType name="OrderType"> 
?。紉s:sequence> 
 ?。紉s:element name="OrderID" type="xs:integer" /> 
  <xs:element name="LineItem" type="LineItemType" /> 
?。?xs:sequence> 
</xs:complexType> 
<xs:complexType name="LineItemType"> 
?。紉s:sequence> 
  <xs:element name="ProductID" type="xs:int" /> 
 ?。紉s:element name="Quantity" type="xs:int" /> 
 ?。紉s:element name="UnitPrice" type="xs:decimal" /> 
?。?xs:sequence> 
</xs:complexType> 
<xs:complexType name="CustomerType"> 
 <xs:sequence> 
 ?。紉s:element name="CustomerID" type="xs:string" /> 
 ?。紉s: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" ?> 
?。糃ustomer xmlns="urn:Sep2003Example"> 
  <CustomerID>ALFKI</CustomerID> 
 ?。糚O>9572658</PO> 
 ?。糀ddress> 
  <Street>One Main Street</Street> 
 ?。糃ity>Anywhere</City> 
 ?。糞tate>NJ</State> 
 ?。糧ip>08080</Zip> </Address> 
 ?。糘rder> 
   <OrderID>10966</OrderID> 
  ?。糒ineItem> 
   ?。糚roductID>37</ProductID> 
   ?。糢nitPrice>26.50</UnitPrice> 
   ?。糛uantity>8</Quantity> 
   ?。糄escription>Gravad lax</Description> 
  ?。?LineItem> 
   <LineItem> 
   ?。糚roductID>56</ProductID> 
   ?。糢nitPrice>38.00</UnitPrice> 
   ?。糛uantity>12</Quantity> 
   ?。糄escription>Gnocchi di nonna Alice</Description> 
  ?。?LineItem> 
  </Order> 
 </Customer> 

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

  列表1: 建立關系數(shù)據(jù)緩存的C#代碼 

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

public class XMLMap 

public static void Main() 


// 建立數(shù)據(jù)集和讀取大綱 
DataSet orderDS = new DataSet("CustOrder"); 
orderDS.ReadXmlSchema("CustOrderLitem.xsd"); 

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

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

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

// 此處插入業(yè)務規(guī)則和數(shù)據(jù)庫更新邏輯 


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(""); 

// 輸出數(shù)據(jù) 
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列,但是它們還是出現(xiàn)在數(shù)據(jù)表中。ReadXmlSchema給數(shù)據(jù)集自動添加這些列。數(shù)據(jù)集把這些列用作外部鍵(foreign key),以模擬Customer元素與它的Order元素之間、Order元素與它的LineItem元素之間的關系。因為典型情況下XML使用嵌套的關系代替了外部鍵,所以數(shù)據(jù)集自動生成自己的主鍵、數(shù)據(jù)表之間的外部鍵,并把它們存儲在這些列中。 

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

圖3:生成的數(shù)據(jù)類型和記錄 

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 

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

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

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

  建立使用數(shù)據(jù)緩存的應用程序 

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

AspNet技術使用.NET存儲XML數(shù)據(jù)的方法,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 武宣县| 沂南县| 通化市| 河北省| 嘉黎县| 阳东县| 内丘县| 顺平县| 菏泽市| 庆阳市| 绥滨县| 孙吴县| 郸城县| 澄城县| 贺兰县| 山阴县| 昌平区| 瑞金市| 虎林市| 五常市| 清水县| 棋牌| 兴隆县| 清涧县| 中牟县| 无为县| 友谊县| 平邑县| 合江县| 天津市| 怀化市| 收藏| 南汇区| 桦川县| 宜宾市| 琼结县| 六安市| 无为县| 淄博市| 奉化市| 宁化县|