1. DataSet
對象l
與SqlDataReader
對象對比SqlDataReader是一種擷取查詢結果快速高效的結構,僅支援向前單向讀取查詢結果,且其中資料為唯讀。DataSet支援迴圈來復原動查看查詢結果,並支援排序、搜尋、緩衝修改資料等功能。l DataSet對象成員DataSet包含DataTable對象和DataRelation對象。DataTable對象包括DataRow、DataColumn和Constraint對象。
2. DataTable
對象 DataTable對象包含Columns屬性和Rows屬性分別為DataColumn集合和DataRow集合,它們分別代表結果集的所有列集合與行集合。l
DataTable
中資料的讀取DataTable中讀取資料要用到DataTable的Rows屬性,其參數指定一個整數代表將要訪問的資料行。
DataRow row=ds.Tables[0].Rows[0];//代表當前行為結果集的第一行
row
[0
] 或者
row
[”OrderID”
];//代表要訪問當前行的第一列或當前行列名為OrderID的列。使用基於索引的讀取資料的方式比使用基於字串的方式能更快的擷取結果。基於迴圈的遍曆查詢結果集的方式如下:
Foreach(DataRow row in ds.Table[0].Rows)
Foreach(DataColumn col in ds.Table[0].Columns)
Consol.WriteLine(row[col]);
3.
校正DataTable
中的資料資料庫中提供各種約束以確保資料的有效性,當資料庫的查詢結果儲存到離線對象DataSet中,對DataSet中的資料進行了增、刪、改操作後由SqlDataAdapter提交到資料庫,為確保處理後的資料對資料庫有效,DataTable需要提供與資料庫類似的資料有效性約束機制來保證DataSet中的資料離線處理後同樣遵循資料庫有有效性約束。l
DataColumn
屬性
ReadOnly
AllowDBNull
MaxLength
Unique(
唯一性)l
DataTable
類的Constraints
集合
UniqueConstraint
類 將DataColumn的Unique屬性設定為True,也是定義該列在DataTable中的唯一性限制式;顯示定義唯一性限制式是將新建立的UniqueConstraint對象添加到Constraints集合中。
PrimaryKey
屬性DataTable類通過PrimaryKey屬性定義該表的主鍵,PrimaryKey屬性包含DataColumn對象數組。
ForeignKeyConstraint
類通常可以通過在DataSet內的兩DataTable對象之間建立DataRealation可以隱式的建立外鍵約束l
代碼中建立DataTable
對象
建立DataTable
對象
DataTable dt=new DataTable(“TableName”) ;//建立DataTable對象並同時命名
向DataSet
的Tables
集合中添加DataTable
DataTable dt=ds.Tables.Add(“Orders”);//建立DataTable並添加到DataSet中
DataTableMapping dtm = new DataTableMapping();
dtm = da.TableMappings.Add("", "Orders");//第一個參數為空白,第二個參數與定義時一致
DataColumnMapping[]columnMaps;
columnMaps = new DataColumnMapping[]
{
new DataColumnMapping("OrderID","
訂單號"),
…...
}
dtm.ColumnMappings.AddRange(columnMaps);
DataColum col=dt.columns.add(“
訂單號”,typeof(int))//DataTable中添加列,列名稱與columnMaps中定義一致
……//設定col的屬性
da.Fill(dt);DataTable的DataSet屬性確定該DataTable是否屬於某個DataSet,如果該DataTable是屬於某個DataSet的Tables集合,則返回該DataSet,否則返回Null。一個DataTablek至多隻能存在於一個DataSet中,如果想將一個DataTable添加到多個DataSet中,必須使用Copy或Clone方法。
提取架構資訊預設情況下,DataAdapter類的Fill方法返回的DataSet和DataTable不包含架構資訊,如果DataTable中不包含某列,DataAdapter會自動添加這些列到DataTable中。DataAdapter類可以通過MissingSchemaAction屬性或FillSchema方法來返回帶有架構資訊的結果集。由於返回帶有架構資訊的結果集會帶來很大的系統消耗,一般情況可以用代碼提供DataTable和DataSet的架構,而避免使用上述兩種方式。l
設定DataTable
約束
設定主鍵 PrimaryKey
屬性DtataTable主鍵PrimaryKey屬性為一個DataColumn對象的數組。
DataTable tbl
=ds.Tables.add(“Customers”);
tbl.Columns.Add(“OrderID”,typeof(int));
tbl.Columns.Add(“ProductID”,typeof(int));
tbl.PrimaryKey=new DataColumn[]{
tbl.Columns[“OrderID”],
tbl.Columns[“ProductID”]}; 添加其它約束DataTable類的Constraints集合有一個重載的Add方法,可用於添加新的主索引值、唯一鍵和外鍵約束。
顯式建立唯一性和外鍵約束的方法如下:
DataTable.Constraints.Add(New UniqueConstraint(…));
DataTable.Constraints.Add(New ForeignKeyConstraint(…));
隱式建立主鍵和唯一性限制式代碼如下:
DataTable.Constraints.Add(“PK_OrderID”,Orders.Columns[“OrderID”],true);
DataTable.Constraints.Add(“UK_CustomerID”,Orders.Columns[“CustomerID”],false);//第一個參數代表所建約束的名稱,第二個參數是對應添加約束的列,第三個參數true代表主鍵約束、false代表唯一性限制式。
隱式建立外鍵約束
DataTable.Constraints.Add(“FK_CustomerID”,tblCustomers.Columns[“CustomerID”]
,tblOrders.Columns[“CustomerID”]);//第一個參數代資料表條件約束名稱,第二個參數代表父表的DataColumn,第三個數組代表子表中的DataColunm。l
處理自動增量列如果資料庫中使用自動增量,Ado.Net的自動增量特性有助於在將這些新行提交到資料庫之前,使掛起插入一致。
DataColumn col=tbl.Columns.Add(“OrderID”,typeof(int));
col.AutoIncrement=true;
col.AutoIncrementSeed=-1;
col.AutoIncrementStep=-1;Ado.Net只是根據DataTable中的資料來產生新的自動增量值,它並不代表資料庫中要產生的下一自動增量值。因此相對於資料庫中的新行,DataTable中的自動增量值只是一個預留位置,不能直接提交給資料庫。l DataTable中添加基於運算式的列資料庫會避免儲存能夠從資料庫中的已有資料中推匯出的資料,SQL語言中支援查詢結果中包含經過計算的列。
Select UnitPrice ,Quantity, UnitPrice*Quantity as ItemTotal from [Order Details]以上查詢語句的查詢結果儲存到DataTable後,如果UnitPrice或Quantity有更改,則DataTable中ItemTotal的值不會改變。Ado.Net支援建立基於運算式的DataColumn對象,可以不在查詢中包含計算後的運算式,而是將一個DataColumn的Expression屬性設定為一個運算式,這樣運算式的值就會隨計算項的值變化而變化。
DataTable tbl=ds.Tables.Add(“Orders”);
tbl.Columns.Add(“Quantity”,typeof(int));
tbl.Columns.Add(“UnitPrice”,typeof(Decimal));
tbl.Columns.Add(“ItemTotal”,typeof(Decimal),”Quantity*UnitPrice”);
4.
修改DataTable
中的資料l
添加新的DataRow
DataRowCollection
類的Add
方法DataTable類的NewRow方法返回新的DataRow對象,設定Item屬性填充各列,然後調用DataRowCollection的Add方法將新行添加到DataTable中。
DataTable tbl=new DataTable(“Customers”);
tbl.Columns.Add(“CustomerID”,typeof(string));
tbl.Columns.Add(“CompanyName”,typeof(string));
DataRow row=tbl.NewRow();
row[“CustomerID”]=”NewCo”;
row[“CompanyName”]=”New Customer”
tbl.Rows.Add(row);DataRowCollection的重載Add方法
tbl.Rows.Add(“NewCo”,”New Customer”);//參數對應DataTable各列的值以上兩種Add方法添加新行的RowState為Added。
DataTable
類的LoadDataRow
方法tbl.LoadDataRow(New Object(){“NewCo”,”New Customer”},False);第一個參數為DataRow各列值清單,第二個參數為False時將會設定DataRow的RowState為Added;如果為True則DataRow的RowState為Unchanged。l
修改現有行
利用DataRow
的Item
屬性修改DataRow對象時,先利用Rows集合的Find方法找到要修改的行,然後利用其Item屬性重新設定各列的值即可。
DataRow row =tbl.Rows.Find(“NewCo”);
If(row==null)
//
未找到相關行
Else
row[“CompanyName”]=”New Value”
End if
使用DataRow
類的BeginEdit
方法和EndEdit
方法調用BeginEdit和EndEdit方法可以緩衝對資料行的修改,調用EndEdit方法儲存對行的更改,如果確定有用儲存更改,可以調用CancelEdit來撤銷更改,該行將返回到BeginEdit時的狀態。
DataRow row =tbl.Rows.Find(“NewCo”);
If(row==null)
//
未找到相關行
Else{
row.BeginEdit();
row[“CompanyName”]=”New Value”
row.EndEdit();
End if
使用DataRow
的ItemArray
屬性使用ItemArray屬性可以擷取修改整個DataRow對象中的資料,每個Item對應DataRow中的一列,可以完成一次更新一行中的多個列值。
DataRow row
=tbl.Rows.Find(“NewCo”);
row.ItemArray=new object[]{null,”New Value”};//null代表對應的列不用更改
處理DataRow
中的Null
值DataRow類的IsNull方法可以查看某一列是否為Null;IsNull方法接受一個列名稱或該列索引的整數或一個DataColumn對象為參數如果某列的值要設定為Null值,應該使用DBNull類的Value屬性。
row[“CompanyName”]=DBNull.Value;l
刪除DataRow
Delete
方法刪除資料行只用調用DataRow的Delete方法即可,但此方法並沒有將資料行從DataTable中刪除,而是由Ado.Net將該行標記為掛起刪除,以便利用DataAdapter類將掛起刪除提交給資料庫。如果從DataTable中完全刪除該行,那麼在提交DataSet的掛起更改時,將不會從資料庫中刪除相應的行。 移除DataRowDataRowCollection類的Remove或RemoveAt方法實現從DataTable中完全移除一個資料行,而不是將資料行標記為掛起更改
DataRow row
=tbl.Rows.Find(“NewCo”);
tbl.Rows.Remove(row);
//or
tbl.Rows.RemoveAt(tbl.Rows.IndexOf(row));另外,DataSet和DataTable類各具有一個Clear方法,可以清除其全部資料對象,但保留內部結構。l
DataRow
的RowState
屬性DataSet可以進行資料緩衝更改,在向資料庫提交這些更改前,緩衝更改不會影響到資料庫的資料。資料庫的更改包括插入、更新、刪除,DataRow的RowState屬性將記錄DataSet的資料更改資訊。RowState屬性值為DataRowState枚舉中的值,列表如下:
| 常數 |
值 |
說明 |
| Unchanged |
2 |
該行未包含任何更改 |
| Detached |
1 |
該行不是DataTabler 成員 |
| Added |
4 |
該行已經被添加到DataTable,但還不存在於資料庫中 |
| Modified |
16 |
該行包含掛起更改 |
| Deleted |
8 |
該行包含掛起刪除 |
SqlDataAdapter類在成功提交儲存在DataSet中的掛起更改後,調用DataRow的AcceptChanges方法,清除儲存在DataRow中的掛起更改。DataRow類的RejectChanges方法,用來撤銷儲存在DataRow中的更改。