前言
在探討DataSet和XML之前,我們首先對ADO.NET進行初步的瞭解。可以說ADO.NET是各種各樣資料訪問技術中最新的一種,它已經成為構建.Net資料庫應用程式的基礎,儘管如此,ADO.NET並不是完全以資料庫為核心的,它整合 XML 支援,提供了平台互用性和可伸縮的資料訪問(這也是ADO.NET和ADO的最大區別)。
在ADO.NET組件中DataSet是其核心組件之一,它提供了獨立於資料來源的資料訪問,為了實現這種平台互用性和可伸縮的資料訪問,ADO.NET採用了基於XML資料的傳輸格式,XML在這裡充當了至關重要的腳色。當資料轉送時,ADO.NET是將DataSet表述為XML,然後以XML格式傳遞給其他組件。DataSet 的這種設計使我們能夠使用 XML 方便地通過 Web 將資料轉送,當然接收資料的組件不一定就是ADO.NET組件,它可以是任何可以處理XML資料的組件,從這裡我們可以明顯的看出ADO.NET比ADO的強大之處。
圖1闡述了.NET資料提供者、DataSet、XML之間的關係:
由DataSet資料轉換為XML資料
為了比較形象的說明DataSet和XML之間的關係,我們利用VS.NET環境開發兩個例子來詳細的說明。
下面我們來看第一個例子,如何使用ADO.NET把DataSet資料寫入到XML檔案中。我們使用Sql Server2000系統內建的Pubs庫,產生關於作者(Authors)資訊的XML檔案。首先建立一個名為DataToXml的Windows應用程式,開啟VS.NET,執行如下步驟:檔案——>建立——>項目,彈出2的視窗,輸入項目名稱:DataToXml,以及儲存項目的位置,點擊“確定”,完成項目的建立工作,此時VS.NET預設會建立一個名為Form1的Windows Form(圖3)。
下一步,建立我們要操作DataSet資料集的表單,建立名為DataToXmlSample的Windows Form。執行如下步驟:在項目資源管理員右擊DataToXml——>添加——添加Windows表單(圖4),彈出建立“添加新項”視窗,輸入DataToXmlSample(圖5)。當然,也可以把VS.NET在建立Windows項目時VS.NET建立的Form1改名為我們需要檔案名稱。
在DataToXmlSample表單上添加我們需要的控制項,在這個例子中,我們需要一個名為lbxXmlData的ListBox,用來瀏覽從資料庫中取出的資訊,兩個Button按鈕,一個是btnViewXml,一個是btnBuildFile,6一樣簡單的在表單上布置這三個控制項。表單的設定工作完成後,下一步進行我們最關鍵的編碼工作。
要運行這個範例,需要匯入Data、Xml、Data SqlClient 、IO名稱空間。我們先從建立DataSet開始我們的編碼,建立CreateDataSet()方法傳回型別為DataSet,這樣就可以在別的方法中直接調用該方法,取得DataSet。
public DataSet CreateDateSet()
{
// 建立到Sql Server資料庫的串連
stringstrconn="DataSource=localhost;Database=Pubs;uid=sa;pwd=";
SqlConnection conn = new SqlConnection ();
conn.ConnectionString = strconn;
conn.Open();
// 建立關於Authors表的資料集
string strAuthorsSql = "SELECT * FROM authors";
SqlDataAdapter da = new SqlDataAdapter(strAuthorsSql,conn);
da.SelectCommand.CommandType = CommandType.Text;
// 聲明DataSet
DataSet ds = new DataSet();
da.Fill (ds,"XMLAuthors");
// 返回DataSet資料集
return ds;
}
下一步編寫代碼產生Xml資料流,編寫BuildXml()方法:
public XmlDocument BuildXml()
{
// 聲明MemoryStream對象
XmlDocument doc=new XmlDocument();
MemoryStream mStrm = new MemoryStream ();
StreamReader sRead = new StreamReader(mStrm);
// 調用CreateDataSet方法把DataSet中的資料輸出
CreateDateSet().WriteXml (mStrm,XmlWriteMode.IgnoreSchema);
// 從資料流的開始位置進行搜尋
mStrm.Seek (0,SeekOrigin.Begin);
// 將資料流載入到XmlDocument
doc.Load (sRead);
return doc;
}
建立寫入XML檔案的方法BuildFile():
private void BuildFile()
{
// 要寫入檔案的路徑
string filepath = "F:\\Authors.xml";
CreateDateSet().WriteXml(filepath);
}
好了,現在基礎工作我們都完成了,下一步需要我們把這些方法組合起來,完成我們的目的。回到設計視窗,雙擊“View Xml”按鈕,切換到代碼編輯視窗,可以看到系統自動增加了一個btnViewXml_Click()方法。在該方法中,我們添加如下代碼把XML資料流填充到ListBox控制項中。
private void btnViewXml_Click(object sender, System.EventArgs e)
{
// 清除ListBox的所有項
lbxXmlData.Items.Clear();
XmlNodeList ndList = BuildXml().GetElementsByTagName("XMLAuthors");
foreach(XmlNode xn in ndList)
lbxXmlData.Items.Add (xn.InnerText);
}
再次回到設計視窗,雙擊“Build File”按鈕,切換到代碼編輯視窗,在系統自動添加的btnBuildFile_Click()方法中添加如下代碼調用上面的BuildFile()方法以產生Authors.xml檔案。
private void btnBuildFile_Click(object sender, System.EventArgs e)
{
BuildFile();
}
為了讓我們的Windows應用程式能夠運行,還需要給程式提供一個進入點:
[STAThread]
static void Main()
{
Application.Run(new DataToXmlSample());
}
好了,到此為止我們這個程式所有的Coding工作都已完成,讓我們來品嘗我們的勞動果實吧!雙擊VS.NET工具列的"啟動"按鈕,啟動應用程式顯示7視窗,單擊"View Xml"按鈕調用btnViewXml_Click()方法,ListBox將被紀錄填充(圖8)。單擊"Build File"按鈕,調用btnBuildFile_Click()方法,在F盤根目錄下產生Authors.xml(9)。
到此為止,我們的第一個例子:從DataSet到XML的轉換已經圓滿的完成了。下一個例子,要把剛才產生的Authors.xml檔案的資料再填充到DataSet中,完成一次資料的輪迴。
由XML資料轉換為DataSet資料
按照剛才建立DataToXml項目的方式建立XmlToData項目,並在在該項目中添加一個Form表單,命名為XmlToDataSetSample。在表單上添加一個名為dgViewXml的DataGrad控制項,一個名為btmLoadXml的Button控制項。單擊"Load Xml"按鈕切換到代碼編輯視窗,輸入如下代碼:
private void btnLoadXml_Click(object sender, System.EventArgs e)
{
DataSet ds = new DataSet();
string filepath = "F:\\Authors.xml";
ds.ReadXml (filepath);
dgViewXml.DataSource = ds;
dgViewXml.DataMember = "XMLAuthors";
}
添加程式進入點:
[STAThread]
static void Main()
{
Application.Run(new XmlToDataSetSample());
}
單擊工具列上的"啟動"按鈕,啟動應用程式(10),單擊"Load Xml"按鈕,程式調用btnLoadXml_Click()方法,把Authors.xml中的資料填充到DataSet中並顯示在DataGrid控制項中(圖11)。
結束語
.NET Framework提供了操作XML的強大支援,在.NET Framework中,DataSet和XML文檔是相同資料的不同視圖。ADO.NET對XML的支援為應用程式間的資料共用提供了易於開發的解決方案,改變了典型分布式系統的面貌。
關於作者
許加寶,網名CNet,現就職於北京千龍新聞網路傳播有限責任公司做網站資訊發布系統的開發,經常在CCW開發人員俱樂部(Dev-Club)的.NET專區活動,對微軟的.NET技術十分感興趣,喜歡XML技術,就.NET相關技術曾經投稿於CSDN的《程式員》雜誌。現在主要涉及的技術有Windows DNA、.NET、XML、SOAP等。您可以通過jiabaoxu@hotmail.com和他聯絡。