填充DataSet資料集的幾種方式
在建立了DataSet對象以後,下面的事情就是向DataSet資料集中填充資料。目前最常用的資料填充方式是和資料庫結合起來使用的,使用DataAdapter對象填充DataSet。在本節中會介紹到這種方式,另外還會介紹其他兩種方式。 詳細講解 1. 把資料庫中的資料通過DataAdapter對象填充DataSet。 這種是在資料庫程式開發過程中最常用到的資料填充方式。使用這種方式主要用到DataAdapter對象的Fill和FillSchema兩種方法來對資料集進行填充。下面開始詳細講解如何将資料從資料庫加載到DataSet中。 DataAdapter填充DataSet的過程分為二步:首先通過DataAdapter的SelectCommand屬性從資料庫中檢索出需要的資料。SelectCommand其實是一個Command對象。然後再通過DataAdapter的Fill方法把檢索來的資料填充DataSet。步驟操作如下: 1). 啟動Visual Studio.NET。 2). 在Visual C#.NET中建立一個“ASP.NET網站”項目。Visual Studio .NET會自動建立一個名稱為:Default.aspx的頁面。 3). 在Default.aspx.cs代碼界面中確定網頁引用System 和 System.Data 這兩個命名空間,這兩個命名空間在建立的時候是預設存在的。 4). 除了System、System.Data這兩個命名空間,還需要System.Data.SqlClient命名空間。可以使用using語句來引用這個命名空間。這樣做得好處是,在後面的代碼中就不需要在這些命名空間中限定聲明了。實作代碼如下所示: //引用命名空間 using System; using System.Data; using System.Data.SqlClient; 5). 既然要從資料庫中擷取資料,那麼第一步就是建立資料庫連接配接,這需要一個SqlCommand對象和一個連接配接字元串。下面代碼中的連接配接字元串連接配接着位于本地計算機(運作這些代碼的計算機)上的 SQL Server 伺服器。您必須根據環境相應地修改該連接配接字元串。建立 SqlConnection 對象後,請調用該對象的 Open 方法以建立實際的資料庫連結。實作代碼如下所示: string sConnectionString; //聲明一個字元串 //連接配接資料庫字元串 sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; "; //建立SqlConnection資料庫連接配接對象 SqlConnection Conn = new SqlConnection(sConnectionString); //打開Conn Conn.Open(); 6). 接下來需要建立一個DataAdapter對象,它表示資料庫和DataSet對象之間的連結。它的作用就相當于在資料庫和DataSet對象建立一座橋梁供資料通過。 您可以将 SQL 或另一類型的用于檢索資料的指令指定為 DataAdapter 的構造函數對象的一部分。下面的示例使用了一個 SQL 語句從Northwind資料庫的Customers表檢索記錄。實作代碼如下所示: SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn); 7). 必須聲明并建立 DataSet 對象的一個執行個體,此時您應為整個 DataSet 提供一個名稱,然後才能開始加載任何資料。該名稱可包含若幹獨立的表。實作代碼如下所示: DataSet ds = new DataSet(); 8). 在SqlDataAdapter類中提供了兩種資料集填充方法。一種是Fill方法,另一種是 FillSchema方法。這兩種方法均可将資訊加載到DataSet中。不同的是Fill方法加載資料本身,而FillSchema方法加載有關特定表的所有可用的中繼資料(如列名、主鍵和限制)。處理資料加載的正确方式是先運作FillSchema,後運作Fill。實作代碼如下所示: Customer.FillSchema(ds,SchemaType.Source,"Customers"); Customer.Fill(ds,"Customers"); 其實在很多時候隻使用Fill也能實作資料填充功能,則隻能加載描述列名和資料類型所需要的基本中繼資料。Fill方法不能加載主鍵資訊,不過這種方法已經可以滿足日常軟體開發的需要了。實作代碼如下所示: Customer.Fill(ds,"Customers"); 9). 這些資料此時作為DataSet的Tables集合内獨立的DataTable對象來提供。如果您在對FillSchema和Fill的調用中指定了一個表名,則可以使用該名稱通路您需要的特定表。 DataTable tblCustomers; //建立一個DataTable資料表 //将這個建立的資料表 tblCustomers = ds.Tables["Customers"]; 10). 下面使用 Foreach循環把DataTable中的“CompanyName”列依次通過探出對話框顯示出來。實作代碼如下所示: //以行為基準做循環 foreach (DataRow drCurrent in tblCustomers.Rows) { //在彈出對話框的形式顯示出來CompanyName烈的資料資訊 Response.Write("<script>alert('" + drCurrent["CompanyName"].ToString() + "')</script>"); } 11). 儲存項目。這樣就完成了一個簡單的資料集填充操作。 下面給給出全部代碼: string sConnectionString; //聲明一個字元串 //連接配接資料庫字元串 sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; "; //建立SqlConnection資料庫連接配接對象 SqlConnection Conn = new SqlConnection(sConnectionString); //打開Conn Conn.Open(); SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn); DataSet ds = new DataSet(); //填充資料集 Customer.Fill(ds, "Customers"); DataTable tblCustomers; //建立一個DataTable資料表 //将這個建立的資料表 tblCustomers = ds.Tables["Customers"]; //以行為基準做循環 foreach (DataRow drCurrent in tblCustomers.Rows) { //在彈出對話框的形式顯示出來CompanyName烈的資料資訊 Response.Write("<script>alert('" + drCurrent["CompanyName"].ToString() + "')</script>"); } 運作效果 如果把上面代碼寫在建立的Web程式中,運作後點選“Button”按鈕,就會得出初始值為0的步長為1的一系列數。 2. 通過DataAdapter對象操作DataSet實作更新資料庫很多時候通過DataSet完成了使用者資料的操作,但是這時候的資料已經被修改了。這些修改的資料要求重新寫入到資料庫中,那麼這時候怎麼辦呢?傳統的思維方式是:把這些資料重新寫回到資料庫中對應的表裡面。但是現在的DataSet是與資料庫斷開的,是以在這個時候就會遇到怎麼用DataSet來更新資料庫的問題。 其實在ADO.NET2.0中通過DataAdapter對象操作DataSet實作更新資料庫。DataAdapter是通過其Update方法實作以 DataSet中資料來更新資料庫的。當DataSet執行個體中包含資料發生更改後,此時調用Update方法,DataAdapter 将分析已作出的更改并執行相應的指令(INSERT、UPDATE 或 DELETE),并以此指令來更新資料庫中的資料。如果DataSet中的DataTable是映射到單個資料庫表或從單個資料庫表生成,則可以利用 CommandBuilder對象自動生成DataAdapter的DeleteCommand、InsertCommand和 UpdateCommand。使用DataAdapter對象操作DataSet實作更新資料庫具體的實作方法,下面代碼可實作删除Customers資料表前5行資料。實作代碼如下所示: string sConnectionString; //聲明一個字元串 //連接配接資料庫字元串 sConnectionString = " Data Source=.;Initial Catalog=Northwind;User ID=sa; "; //建立SqlConnection資料庫連接配接對象 SqlConnection Conn = new SqlConnection(sConnectionString); //打開Conn Conn.Open(); //建立并初始化SqlCommand對象 SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn); DataSet ds = new DataSet(); //使用SqlDataAdapter的Fill方法填充DataSet Customer.Fill(ds, "Customers"); DataTable tblCustomers; //建立一個DataTable資料表 //将這個建立的資料表 tblCustomers = ds.Tables["Customers"]; //關閉資料連接配接 Conn.Close ( ) ; //删除資料表中前5行資料 for (int i = 0; i < 5; ++i) { ds.Tables["Customers"].Rows[i].Delete ( ) ; } //删除DataSet中删除資料表Customers中第一行資料 ds.Tables["Customers"].AcceptChanges ( ) ; 由于不了解DataSet結構和與資料庫關系,很多初學者往往隻是更新了DataSet中的資料,就認為資料庫中的資料也随之更新,是以當打開資料庫浏覽時發現并沒有更新資料,都會比較疑惑,通過上面的介紹,疑惑應當能夠消除了。 3. 把XML資料流或文本加載到DataSet 由于ADO.NET2.0中增強了與XML檔案的結合,是以在這個時候DataSet中的資料可以從XML資料流或文檔建立。加載XML資料流和文檔到 DataSet中是可使用DataSet對象的ReadXml方法。該ReadXml方法讀取 XML 流或文檔的内容并将資料加載到 DataSet 中。根據所指定的XmlReadMode和關系架構是否已存在,它還将建立DataSet的關系架構。 實作代碼如下所示: DataSet ds= new DataSet("xmlds"); ds.ReadXml("c:databases.xml");