【ADO.NET】離線資料處理-DataSet對象

來源:互聯網
上載者:User
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中的更改。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.