当前位置: 首页 > 编程语言 > C#

C#中DataSet、DataTable、DataView的区别和用法分享

时间:2023-04-10 12:33:10 C#

1.创建Dataset和DataTableDataSetds=newDataSet();//DataSetName默认为"NewDataSet"DataTabletable=ds.Tables。添加(“客户”);//或//DataTabletable1=newDataTable("Customers");//ds.Tables.Add(table1);//添加列DataColumncol=table.Columns.Add("OrderID",typeof(int));//Type.GetType("System.Int32")col.AllowDBNull=false;col.MaxLength=5;col.Unique=true;//自动为该列添加UniqueConstraint约束table.PrimaryKey=newSystem.Data.DataColumn[]{table.Columns["CustomerID"]};//设置主键,自动设置AllowDBNull为false,自动应用UniqueConstraint约束//自动增长列DataColumncol1=table.Columns.Add("OrderID",typeof(int));col.AutoIncrement=真;col.AutoIncrementSeed=1;col.AutoIncrementStep=1;col.ReadOnly=真;//计算列table.Columns.Add("ItemTotal",typeof(decimal),"Quantity*Unique");2.添加一行//使用DataRowCollection对象的Add()方法DataRowrow=ds.Tables[0].NewRow();row["CustomerID"]="ALFKI";行["客户名称"]="XX";ds.Tables[0].Rows.Add(行);//使用Table对象的LoadDataRow方法object[]rowData={"ALFKI","XX","x",""};ds.Tables[0].LoadDataRow(rowData,false);3.修改行//使用DataRow对象的BeginEdit和EndEdit方法DataRowrow=ds.Tables[0].Rows.Find("ANTON");//在主键列中查找,可以使用索引来访问行ds.Tables[0].Rows[3]if(row!=null){row.BeginEdit();row["CompanyName"]="新公司";row["ContactName"]="新联系人";行.EndEdit();}//使用DataRow对象的ItemArray属性进行赋值。objec[]rowData={null,"NewCompany","NewContact",null};//null表示不修改列数据DataRowrow=ds.Tables[0].Rows.Find("ALFKI");行.ItemArray=rowData;//单字段修改if(row.IsNull("phone")){row["phone"]=DBNull.Value;}//判断字段值是否为空,如果为空则赋空值。4.删除行//Delete方法不是从DataTable中删除一行,而是将其标记为已删除。//循环删除时最好使用Delete方法,所以先标记删除,然后统一使用table.AcceptChanges()方法提交,或者RejectChanges()方法实现行状态DataRow[]的回滚rows=ds.Tables[0].Select("Companelike'a%'");foreach(DataRow行中的行){行。删除();}ds.Tables[0].AcceptChanges();//如果行的RowState是Added,调用Delete后,RowState会变为Detached。调用AcceptChanges后,该行将从表中删除。//如果该行的RowState为Unchanged,调用Delete后,RowState会变为Deleted。调用AcceptChanges后,该行将从表中删除。//Remove和RemoveAt方法实际上是从DataRow中删除一行,相当于先调用DataRow.Delete()方法,再调用AcceptChanges()方法。DataRowState状态更改两次。DataRowrow=ds.Tables[0].Rows.Find("ALFKI");ds.Tables[0].Rows.Remove(row);//ds.Tables[0].RemoveAt(index)//清除方法ds.Tables[0].Clear();ds.Clear();数据行状态(RowState)UnChanged状态:指表中的行自创建以来未发生变化的状态,或者该行上次接受修改后,至今未发生变化。已添加状态:该状态表示该行已添加到表中,但尚未调用表对象的AcceptChanged方法。当调用AcceptChanged方法时,所有处于已添加状态的行都会更改为未更改状态。修改状态:此状态表示该行已被修改。当调用AcceptChanged方法时,所有处于Modified状态的行都变为Unchanged状态Deleted状态:该状态表示该行已经从表中删除,但是表对象的AcceptChanged方法还没有被调用Detached状态:这个state表示该行不属于任何表,或者已经从表中分离出来,不再属于任何表的DataRow对象。新创建的行(DataRow对象)处于分离状态。将其添加到DataTable对象后,DataRow对象的状态变为Added状态。如果DataRow已被修改,则该行处于Modified状态。如果使用Remove方法从表中删除了DataRow对象,或者使用Delete方法和AcceptChanged方法删除了行,则该行处于Detached状态。5.MergetwoDataSets//将指定的dataSet、datatable或datarow[]与当前ds合并,在此过程中,根据给定的参数保留或丢弃当前ds的变化,并对不兼容的schema进行处理。ds.Merge(DataSetotherDataSet,boolpreserveChanges,System.Data.MissingSchemaActionmissingSchemaAction);preserveChanges:当两个数据集包含主键值相同的记录时,是否保留当前ds的变化,默认为false。false:用otherDataSet的记录更新当前ds记录。ds存在但otherDataSet不存在的主键行结果将被删除。true:保留ds的记录,并增加新的记录。MissingSchemaAction:当两个数据集包含不同列(两个具有不同模式的DataSet)时的处理方式。Add:AddsnewcolumnsofotherDataSettods.AddWithKey:AddsnewcolumnsandprimarykeyinformationofotherDataSettods.Error:如果缺少指定的列映射,则生成InvalidOperationException。忽略:忽略任何新列。ds.Tables[0].Merge(dataSet.Tables[0],false,MissingSchemaAction.Add);6.添加关系ds.Relations.Add("CustomerToOrders",//关系名:默认关系名是DataRelationds.Tables["Customer"].Columns["CustomerID"],//父列,可以是一个arrayds.Tables["Orders"].Columns["CustomerID"]//子列,可以是数组);注意:默认为父表创建一个UniqueConstraint,为子表创建一个ForeignKeyConstraint。您可以通过使用DataRelation的构造函数参数之一来避免自动创建约束。//从父行获取子行:GetChildRowsDataRow[]rows=ds.Tables["Customer"].Rows[0].GetChildRows("CustomerToOrders");//CustomerToOrders是关系名称。//从子行获取行:GetChildRows或GetParentRowDataRow[]rows=ds.Tables["Orders"].Rows[0].GetParentRows("CustomerToOrders");//获取不同的行版本:if(rows[0].Original:表示该行的原始值,Added状态的行版本不存在。Proposed:表示该行的建议值。该行版本存在于不属于该表的行,即处于Detached状态的行;对于正在编辑的行,此行版本也存在。默认:指示行的默认版本。Added、Modified或Unchanged状态下的一行的默认行版本是Current;处于删除状态的行的默认行版本是Original。建议使用处于Detached状态的行的默认版本。当调用AcceptChanged方法时,所有处于deleted状态的行都会变为Detached状态,即被移除。其余行将变为未更改,原始版本中的值将被当前行版本的值覆盖。7.数据约束。1.对于主键约束,使用UniqueConstraintUniqueConstraintunique=newUniqueConstraint(ds.Tables[0].Columns["phone"]);ds.Tables[0].Constraints.Add(唯一);2.外键约束:ForeignKeyConstraintForeignKeyConstraintfk=newForeignKeyConstraint("CustomerOrder",ds.Tables["Customer"].Columns["CustomerID"],//父列,可以是数组ds.Tables["Orders"].Columns["CustomerID"]//子列,可以是数组);fk.UpdateRule=Rule.Cascade;fk.DeleteRule=Rule.SetNull;fk.AcceptRejectRule=Rule.None;ds.Tables["Orders"].Constraints.Add(fk);//给word表添加约束,target自动添加Unique约束。当对从表的列或行执行一些操作时,使用这些规则——来确定应该对子表的行执行的操作的规则。Rule.Cascade:级联(默认);Rule.None(无动作);规则.SetDefault;Rule.SetNull四.注意:启用约束的前提是:ds.EnforceConstraints=true;//true为默认值。只有在DataSet上执行AcceptChanges或RejectChanges方法时才会执行AccpetRejectRule。晚于UpdateRule和DeleteRule执行。八、DataTable事件dt.ColumnChangingdt.ColumnChangeddt.RowChangingdt.RowChangeddt.RowDeletingdt.RowDeleteddt.TableClearingdt.TableCleareddt.TableNewRowcustTable.ColumnChanged+=newDataColumnChangeEventHandler(Column_Changed);privatestaticvoidColumn_Changed(objectsender,DataColumnChangeEventArgse){Console.WriteLine("Column_ChangedEvent:name={0};Column={1};originalname={2}",e.Row["name"],e.Column.ColumnName,e.Row["名称",DataRowVersion.Original]);}9.DataSet的其他方法ds.Clone();//只克隆一个结构相同的Datasetds.Copy();//复制一个结构相同、内容相同的Datasetds.ReadXml("D:1.xml");ds.ReadXmlSchema("D:1.xml");ds.WriteXml("D:1.xml",XmlWriteMode.WriteSchema);ds.WriteXmlSchema("D:1.xml");ds.GetXml()://返回schema和内容的XMLds.GetXmlSchema://只返回schema信息DataTabledt;dt.Compute(表达式,过滤器);//Computedt.Select(filter,sort,DataViewRowState)10.DataTableSelect()方法获取DATAROW对象数组Select()Select(stringfilterExpression)Select(stringfilterExpression,stringsort)Select(stringfilterExpression,stringsort,DataViewRowStaterecordStates)注意事项:上面的Select操作是不区分大小写的(记录字段不区分大小写),如果需要区分大小写,需要将DataTable的caseSensitive属性设置为trueDataRow[]arrRows=table.Select("pubdate>='#1/1/2000#'");//以下语句选择Pubdate字段日期为2000年1月1日或之后的DataRowDataRow[]arrRows=table.Select("statein('ca','tn','wa')");//支持in,返回"state"等于CA,TN或WA的所有行DataRow[]arrRows=table.Select("statelike'ca*'");//支持likeDataRow[]arrRows=table.Select("isnull(state,0)=0");//也可以使用一些Sql函数来选取State字段为空的记录inDataTableDataRow[]arrRows=table.Select("state='tn'andziplike'37*'");//也可以用And,OrandNotDataRow[]arrRows=table.Select("id>5","iddesc");//具有过滤、排序和行状态的完整方法:DataRow[]arrRows=table.Select("id>5","iddesc",DataViewRowState.Added);十一、DataView数据视图//创建数据视图DataViewDataViewdv=ds.Tables["Author"].DefaultView;//或DataViewdv=newDataView(ds.Tables["Author"]);//行过滤dv.RowFilter="state='CA'andCity=aa";//行过滤,日期需要用#号包围。或dv.RowFilter="Sum(child.unitPrice>100)"//可用函数Convert,Len,IsNull,IIF,SubStringdv.RowStateFilter=DataViewRowState.Added|DataViewRowState.OriginalRows;//主键查找introwIndex=dv.Find("wison");//注意是查找得到行索引。DataRowView[]rowviews=dv.FindRows("Raing");//字段排序dv.Sort="statedesc,firstNameasc";//添加行dv.AllowNew=true;DataRowViewnewRow=dv.AddNew();newRow["客户名"]="aa";//修改行dv.AllowEdit=true;dv[0]["客户名"]="aa";//删除行dv.AllowDelete=true;dv.删除(1);//遍历foreach(DataRowViewrowviewindv){rowview["customername"]="aa";}DataView的行状态(DataViewRowState):添加:新行。CurrentRows:当前行包括未更改行、新行和修改行。(默认情况下,DataViewRowState设置为CurrentRows。)已删除:已删除的行。ModifiedCurrent:修改原始数据的当前版本ModifiedOriginal:修改数据的原始版本。无:无。OriginalRows:原始行包括未更改的行和删除的行。未更改:未更改的行。12.DataViewManagerDataViewManagermanager=ds.DefaultViewManager;//或newDataViewManager(ds)DataViewdv=manager.CreateDataView(ds.Tables[0]);//创建DataView//或manager.DataViewSettings["Order"]。Sort="orderDatedesc"以上就是C#学习教程:C#中DataSet、DataTable、DataView的区别和用法以及所有分享的内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: