淺談DataSet 的用法

javaprogramers發表於2005-04-21

   DataSet是ADO.NET開發人員為方便資料處理開發出來的,是資料的集合,是為解決DataReader的缺陷設計的,DataReader資料處理速度快,但它是隻讀的, 而且一旦移到下一行,就不能檢視上一行的資料,DataSet則可以自由移動指標。DataSet的資料是與資料庫斷開的。DataSet還可用於多層應用程式中,如果應用程式執行在中間層的業務物件中來訪問資料庫,則業務物件需將離線資料結構傳遞給客戶應用程式。

  DataSet的功能:瀏覽、排序、搜尋、過濾、處理分級資料、快取更改等。還可以與XML資料互換。DataSet中可包括多個DataTable,可將多個查詢結構存到一個DataSet中,方便操作,而DataTable中又包括多個DataRow、DataColumn,可通過這些DataRow、DataColumn來檢視、操作其中的資料,而需將操作結果返回給資料庫的話,則可以呼叫DataAdapter的Update方法。

  DataSet的操作:

DataSet ds=new DataSet();
DataTable dt
=new DataTable("newTable");
ds.Tables.Add(dt);
DataSet ds=new DataSet();
DataTable dt
=ds.Tables.Add("newTable");

上述兩種方法都可以在DataSet中新增一個DataTable,看需要而進行選擇。新增DataTable後,需向其中新增行和列。

DataSet ds=new DataSet();
DataTable dt
=ds.Tables.Add("newTables");
DataColumn col
=dt.Columns.Add("newColumn",typeof(int));
col.AllowDBNull
=false;
col.MaxLength
=4;
col.Unique
=true;

上述程式碼向DataSet中的DataTable中新增名為”newColumn”,型別為int且不為空,最大長度為4和唯一性為真的列。

dt.PrimaryKey=new DataColumn[]{dt.Columns["ID"]}

這段程式碼是繼續上面程式碼的,為一個DataTable中新增一個主鍵列,主鍵列是一個資料組,如有多個主鍵,只需在陣列中新增一個列即可。如下:

dt.PrimaryKey=new DataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]}

新增外來鍵:

ForeignKeyConstraint fk;
fk
=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
ds.Tables[
"Orders"].Constraints.Add(fk);
//上述程式碼假如已經為Cusomers表和Orders建立了主鍵,此句為新增外來鍵約束。

上述是根據Customers表和Orders表的CustomerID來建立約束。

下面介紹修改DataRow中的內容:

DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");
if(dr==null)

else
{
dr.BeginEdit(); 
dr[
"CompanyName"]="newValue";
dr[
"ContactName"]="newValue2";
dr.EndEdit();
}

//上面程式碼通過Row集合的Find方法來在DataTable中的行進行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通過BeginEdit和EndEdit來快取對行的修改,還可呼叫 CancelEdit為取消修改。

判斷某列是否為空值:

DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
if(dr.IsNull("ContactName");
 ..
else
 dr[
"ContactName"]=DBNull.Value
//這裡判斷ContactName列是否為空,如果不是則為其賦空值,呵,很無厘頭的做法,這裡只為演示為列賦空值的做法。
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
if(dr.IsNull("ContactName");
 ..
else
 dr[
"ContactName"]=DBNull.Value
//這裡判斷ContactName列是否為空,如果不是則為其賦空值,呵,很無厘頭的做法,這裡只為演示為列賦空值的做法。

刪除DataRow:

有兩種方法可以刪除DataRow,Delete方法和Remove方法和RemoveAt方法。其區別是Delete方法實際上不是從DataTable中刪除掉一行,而是將其標誌為刪除,僅僅是做個記號,而Remove方法則是真正的從DataRow中刪除一行,RemoveAt方法是根本行的索引來刪除。列:

DataRow dr=ds.Tables["table"].Rows.Find("a");
ds.Tables[
"table"].Remove(dr);

ds.Tables[
"table"].Remove(index);
//dr 為"a"所在的行,查出後將其刪除,index為 "a"所在的索引號。
關於DataSet中的其用法,參照MSDN