C#中DataSet,DataTable,DataView的區(qū)別與用法
一、創(chuàng)建Dataset和DataTable
DataSet ds = new DataSet();//DataSetName默認(rèn)為"NewDataSet" DataTable table = ds.Tables.Add("Customers"); //或者 //DataTable table1 = new DataTable("Customers"); //ds.Tables.Add(table1); //添加列 DataColumn col=table.Columns.Add("OrderID",typeof(int)) ;//Type.GetType("System.Int32") col.AllowDBNull=false; col.MaxLength=5; col.Unique = true;//為此列自動(dòng)添加一個(gè)UniqueConstraint約束 table.PrimaryKey = new System.Data.DataColumn[] {table.Columns["CustomerID"]};//設(shè)置主鍵,AllowDBNull自動(dòng)設(shè)成false,自動(dòng)應(yīng)用UniqueConstraint約束 //自動(dòng)增長(zhǎng)列 DataColumn col1=table.Columns.Add("OrderID",typeof(int)); col.AutoIncrement=true; col.AutoIncrementSeed=1; col.AutoIncrementStep=1; col.ReadOnly=true; //計(jì)算列 table.Columns.Add("ItemTotal",typeof(decimal),"Quantity*Unique");
二、添加行
//使用DataRowCollection對(duì)象的Add()方法 DataRow row = ds.Tables[0].NewRow(); row["CustomerID"] = "ALFKI"; row["CustomerName"] = "XX"; ds.Tables[0].Rows.Add(row); //使用Table對(duì)象的LoadDataRow方法 object[] rowData = { "ALFKI", "XX", "x", "" }; ds.Tables[0].LoadDataRow(rowData, false);
三、修改行
//使用DataRow對(duì)象的BeginEdit、EndEdit方法。 DataRow row = ds.Tables[0].Rows.Find("ANTON");//在主鍵列查找,可以用索引訪問(wèn)行ds.Tables[0].Rows[3] if (row != null) { row.BeginEdit(); row["CompanyName"] = "New Company"; row["ContactName"] = "New Contact"; row.EndEdit(); } //使用DataRow對(duì)象ItemArray屬性進(jìn)行賦值。 objec[] rowData = { null, "New Company", "New Contact", null };//null表示不修改該列數(shù)據(jù) DataRow row = ds.Tables[0].Rows.Find("ALFKI"); row.ItemArray = rowData; //單個(gè)字段修改 if (row.IsNull("phone")) { row["phone"] = DBNull.Value; }//判斷字段值是否為空,是則賦予空值。
四、刪除行
//Delete方法實(shí)際上不是從DataTable中刪除掉一行,而是將其標(biāo)志為刪除. //循環(huán)刪除的時(shí)候最好用Delete方法,這樣先做刪除標(biāo)記,然后用table.AcceptChanges()方法統(tǒng)一提交,或者RejectChanges() 方法實(shí)現(xiàn)行狀態(tài)的回滾 DataRow[] rows = ds.Tables[0].Select("Compane like 'a%'"); foreach (DataRow row in rows) { row.Delete(); } ds.Tables[0].AcceptChanges(); //如果該行的 RowState 為 Added,則在調(diào)用 Delete后, RowState 將變?yōu)?Detached。 在調(diào)用 AcceptChanges 之后,將從表中移除該行。 //如果該行的 RowState 為 Unchanged,則在調(diào)用 Delete后,RowState 將變?yōu)?Deleted。 在調(diào)用 AcceptChanges 之后,將從表中移除該行。 //Remove和RemoveAt方法則是真正的從DataRow中刪除一行,等同于先調(diào)用 DataRow.Delete() 方法再調(diào)用 AcceptChanges()方法。DataRowState狀態(tài)改變兩次。 DataRow row = ds.Tables[0].Rows.Find("ALFKI"); ds.Tables[0].Rows.Remove(row);//ds.Tables[0].RemoveAt(index) //Clear方法 ds.Tables[0].Clear(); ds.Clear();
數(shù)據(jù)行狀態(tài) (RowState)
- UnChanged狀態(tài):指表中的行自創(chuàng)建之后沒(méi)有做過(guò)任何改動(dòng)的狀態(tài),或則是行在上次接受修改之后,至今未做過(guò)任何改動(dòng)的狀態(tài)。
- Added狀態(tài):該狀態(tài)是指已經(jīng)將行添加到表中,但是尚未調(diào)用表對(duì)象的AcceptChanged方法。調(diào)用AcceptChanged方法時(shí),所有處在Added狀態(tài)的行都變?yōu)閁nchanged狀態(tài)。
- Modified狀態(tài):該狀態(tài)表示該行已經(jīng)被修改。調(diào)用AcceptChanged方法時(shí),所有處在Modified狀態(tài)的行都變?yōu)閁nchanged狀態(tài)
- Deleted狀態(tài):該狀態(tài)表示該行已經(jīng)從表中刪除,但是尚未調(diào)用表對(duì)象的AcceptChanged方法
- Detached狀態(tài):該狀態(tài)表示該行不屬于任何表,或則已經(jīng)從表中分離出去了,不再屬于任何表的DataRow對(duì)象。
新建的行(DataRow對(duì)象)處于Detached狀態(tài),把它添加到DataTable對(duì)象之后,該DataRow對(duì)象的狀態(tài)變?yōu)锳dded狀態(tài)。如果對(duì)該DataRow進(jìn)行了修改,則該行處于Modified狀態(tài)。如果使用Remove方法從表中移除該DataRow對(duì)象,或則使用Delete方法和AcceptChanged方法移除該行,則該行處于Detached狀態(tài)。
五、合并兩個(gè)DataSet
//將指定的 dataSet、datatable或datarow[] 與當(dāng)前的 ds 合并,在此過(guò)程中,將根據(jù)給定的參數(shù)保留或放棄在當(dāng)前 ds 中的更改并處理不兼容的架構(gòu)。 ds.Merge(DataSet otherDataSet, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
preserveChanges:當(dāng)兩個(gè)數(shù)據(jù)集包含相同主鍵值的記錄時(shí),是否保留當(dāng)前ds的更改,默認(rèn)為false。
- false:用otherDataSet的記錄來(lái)更新當(dāng)前ds記錄。ds存在而otherDataSet不存在的主鍵行結(jié)果將被刪除。
- true:保留ds的記錄,并加入新記錄。
MissingSchemaAction:當(dāng)兩個(gè)數(shù)據(jù)集包含不同的列時(shí)(兩個(gè)具有不同模式的DataSet)的處理方法。
- Add:添加otherDataSet的新列到ds.
- AddWithKey:添加otherDataSet的新列和主鍵信息到ds.
- Error:如果缺少指定的列映射,則生成 InvalidOperationException。
- Ignore:忽略任何新列。
ds.Tables[0].Merge(dataSet.Tables[0], false, MissingSchemaAction.Add);
六 、添加關(guān)系
ds.Relations.Add("CustomerToOrders",//關(guān)系名:默認(rèn)關(guān)系名為DataRelation ds.Tables["Customer"].Columns["CustomerID"],//父列,可為數(shù)組 ds.Tables["Orders"].Columns["CustomerID"]//子列,可為數(shù)組 );
注意:默認(rèn)會(huì)創(chuàng)建UniqueConstraint到父表,F(xiàn)oreignKeyConstraint約束到子表。
可以使用DataRelation的一個(gè)構(gòu)造函數(shù)的參數(shù)倆避免自動(dòng)創(chuàng)建約束。
//從父行獲取子行:GetChildRows DataRow[] rows = ds.Tables["Customer"].Rows[0].GetChildRows("CustomerToOrders");//CustomerToOrders為關(guān)系名。 //從子行獲取行行:GetChildRows 或或者GetParentRow DataRow[] rows = ds.Tables["Orders"].Rows[0].GetParentRows("CustomerToOrders");// //獲取不同的行版本: if (rows[0].HasVersion(DataRowVersion.Proposed) { rows = rows[0].GetChildRows("CustomerToOrders", DataRowVersion.Proposed); }
數(shù)據(jù)行版本(DataRowVersion)
- Current:表示行的當(dāng)前值。處于deleted狀態(tài)的行不存在該行版本。
- Original:表示行的原始值。處于Added狀態(tài)的行不存在該行版本
- Proposed:表示行的建議值。不屬于表的行,即處于Detached狀態(tài)的行存在該行版本;對(duì)于正在進(jìn)行編輯的行,也存在該行版本。
- Default:表示行的默認(rèn)版本。處于Added,Modified或則Unchanged狀態(tài)的行的默認(rèn)行版本是Current;處于deleted狀態(tài)的行的默認(rèn)行版本是Original。處于Detached狀態(tài)的行的默認(rèn)版本是proposed。
當(dāng)調(diào)用AcceptChanged方法,所有處于deleted狀態(tài)的行將變?yōu)镈etached狀態(tài),即被移除。其余的行會(huì)變?yōu)閁nchanged狀態(tài),并且Original版本中的值會(huì)改寫(xiě)為Current行版本的值。
七、數(shù)據(jù)約束。
1、主鍵約束,使用UniqueConstraint
UniqueConstraint unique = new UniqueConstraint(ds.Tables[0].Columns["phone"]); ds.Tables[0].Constraints.Add(unique);
2、外鍵約束:ForeignKeyConstraint
ForeignKeyConstraint fk = new ForeignKeyConstraint("CustomerOrder", ds.Tables["Customer"].Columns["CustomerID"],//父列,可為數(shù)組 ds.Tables["Orders"].Columns["CustomerID"]//子列,可為數(shù)組 ); fk.UpdateRule = Rule.Cascade; fk.DeleteRule = Rule.SetNull; fk.AcceptRejectRule = Rule.None; ds.Tables["Orders"].Constraints.Add(fk);//在字表中添加約束,且目標(biāo)自動(dòng)添加Unique約束。
在對(duì)附表的列或行執(zhí)行某種操作時(shí),使用這些規(guī)則一確定應(yīng)對(duì)子表行進(jìn)行的操作規(guī)則。
- Rule.Cascade:級(jí)聯(lián)(默認(rèn));
- Rule.None(無(wú)動(dòng)作);
- Rule.SetDefault;
- Rule.SetNull四種。
注意:?jiǎn)⒂眉s束前提是:
ds.EnforceConstraints = true;//true為默認(rèn)值
在對(duì)DataSet執(zhí)行AcceptChanges或RejectChanges方法時(shí),才執(zhí)行AccpetRejectRule。比UpdateRule和DeleteRule要晚執(zhí)行。
八、DataTable事件
- dt.ColumnChanging
- dt.ColumnChanged
- dt.RowChanging
- dt.RowChanged
- dt.RowDeleting
- dt.RowDeleted
- dt.TableClearing
- dt.TableCleared
- dt.TableNewRow
custTable.ColumnChanged += new DataColumnChangeEventHandler(Column_Changed ); private static void Column_Changed(object sender, DataColumnChangeEventArgs e ) { Console.WriteLine("Column_Changed Event: name={0}; Column={1}; original name={2}", e.Row["name"], e.Column.ColumnName, e.Row["name", DataRowVersion.Original]); }
九、DataSet其他方法
ds.Clone();//只克隆一個(gè)相同結(jié)構(gòu)的Dataset ds.Copy();//復(fù)制一個(gè)相同結(jié)構(gòu)和相同內(nèi)容的Dataset ds.ReadXml("D:\1.xml"); ds.ReadXmlSchema("D:\1.xml"); ds.WriteXml("D:\1.xml",XmlWriteMode.WriteSchema); ds.WriteXmlSchema("D:\1.xml"); ds.GetXml()://返回模式和內(nèi)容的XML ds.GetXmlSchema://只返回模式信息 DataTable dt; dt.Compute(expression,filter); //計(jì)算 dt.Select(filter,sort,DataViewRowState)
十、DataTable的Select()方法
獲取DATAROW對(duì)象的數(shù)組
- Select()
- Select(string filterExpression)
- Select(string filterExpression, string sort)
- Select(string filterExpression, string sort, DataViewRowState recordStates)
注意事項(xiàng):上面的Select操作是大小寫(xiě)不敏感的(記錄的字段不敏感),如果需要區(qū)分大小寫(xiě),需要將DataTable的caseSensitive屬性設(shè)為true。
DataRow[] arrRows = table.Select("pubdate>='#1/1/2000#'");//下面這條語(yǔ)句選擇Pubdate字段日期在2000年1月1日當(dāng)天或之后的DataRow DataRow[] arrRows = table.Select("state in('ca','tn','wa')");//支持in, 返回"state"等于CA、TN或WA的所有行 DataRow[] arrRows = table.Select("state like 'ca*'");//支持like DataRow[] arrRows = table.Select("isnull(state,0)=0");//還可以使用一些Sql函數(shù),在DataTable中選擇State字段為空的記錄 DataRow[] arrRows = table.Select("state='tn' and zip like '37*'");//還可以使用And、Or和Not DataRow[] arrRows = table.Select("id>5", "id desc"); //帶過(guò)濾、排序和行狀態(tài)的完整方法: DataRow[] arrRows = table.Select("id>5", "id desc", DataViewRowState.Added);
十一、DataView數(shù)據(jù)視圖
//創(chuàng)建數(shù)據(jù)視圖DataView DataView dv = ds.Tables["Author"].DefaultView;//或者DataView dv = new DataView(ds.Tables["Author"]); //行過(guò)濾 dv.RowFilter = "state='CA' and City=aa";//行過(guò)濾,日期需要用#號(hào)包圍?;蛘遜v.RowFilter = "Sum(child.unitPrice>100)"http://可用的函數(shù)Convert,Len,IsNull,IIF,SubString dv.RowStateFilter = DataViewRowState.Added | DataViewRowState.OriginalRows; //主鍵查找 int rowIndex = dv.Find("wison");//注意查找獲取行索引。 DataRowView[] rowviews = dv.FindRows("Raing"); //字段排序 dv.Sort = "state desc,firstName asc"; //添加行 dv.AllowNew = true; DataRowView newRow = dv.AddNew(); newRow["customername"] = "aa"; //修改行 dv.AllowEdit = true; dv[0]["customername"] = "aa"; //刪除行 dv.AllowDelete = true; dv.Delete(1); //遍歷 foreach (DataRowView rowview in dv) { rowview["customername"] = "aa"; }
DataView的行狀態(tài)(DataViewRowState):
- Added:新行。
- CurrentRows:當(dāng)前行包括未更改的行、新行和已修改的行。 (默認(rèn)情況下,DataViewRowState 設(shè)置為 CurrentRows。)
- Deleted:已刪除的行。
- ModifiedCurrent:已修改的原始數(shù)據(jù)的當(dāng)前版本
- ModifiedOriginal:已修改數(shù)據(jù)的原始版本。
- None:無(wú)。
- OriginalRows:原始行包括未更改的行和已刪除的行。
- Unchanged:未更改的行。
十二、DataViewManager
DataViewManager manager=ds.DefaultViewManager;//或new DataViewManager(ds) DataView dv=manager.CreateDataView(ds.Tables[0]);//創(chuàng)建DataView //或者 manager.DataViewSettings["Order"].Sort="orderDate desc"
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)QQ截圖功能及相關(guān)問(wèn)題
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)QQ截圖功能及相關(guān)問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10C#實(shí)現(xiàn)簡(jiǎn)單超市收銀系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單超市收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例
ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,可以用來(lái)存儲(chǔ)任意類(lèi)型的元素,本文就來(lái)介紹一下C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12C#實(shí)現(xiàn)壓縮圖片為可控制的JPEG格式
這篇文章主要為大家詳細(xì)介紹了使用C#實(shí)現(xiàn)將圖片壓縮為質(zhì)量可自己控制的JPEG的幾種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01C#使用BitConverter與BitArray類(lèi)進(jìn)行預(yù)定義基礎(chǔ)類(lèi)型轉(zhuǎn)換
這篇文章介紹了C#使用BitConverter與BitArray類(lèi)進(jìn)行預(yù)定義基礎(chǔ)類(lèi)型轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05