DataTable和DataSet

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

DataSet和DataTable有用的方法每一个DataSet都是一个或多个DataTable对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(ColumnName)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序(DataView)信息组成。DataView用来在观察数据时提供排序和过滤的功能。DataColumn用来对表中的数据值进行一定的规限。比如哪一列数据的默认值是什么、哪一列数据值的范围是什么、哪个是主键、数据值是否是只读等。由于一个DataSet可能存在多张表,这些表可能存在关联关系,因此用parentRelations和childRelations来表述。ParentRelations表是父表,childRelations是子表,子表是对父表的引用,这样就使得一个表中的某行与另一个表中的某一行甚至整个表相关联。1.DataTableCollection类表示DataSet的表的集合。DataTableCollectiondtc=ds.Tables;DataTablecustomerTable=dtc[Product];2.DataTable进行动态的筛选和排序调用DataTable.Select()方法,获取DataRow对象的数组。(1)获取所有行。DataRow[]rows=dt.Select();(2)按主键顺序(如没有主键,则按照添加顺序)获取符合筛选条件的行。DataRow[]rows=dt.Select(ID52);(3)获取符合筛选条件的行,并按指定的排序条件排序。DataRow[]rows=dt.Select(ID52,IDDESC);(4)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。stringstrExpr=ID52;stringstrSort=IDDESC;DataRow[]foundRows=dt.Select(strExpr,strSort,DataViewRowState.OriginalRows);3.DataTable进行数据统计我们在使用SQLServer时,可以轻松地对数据进行Sum、Aver、Count等操作以获得统计结果,那么,在已经把数据检索出来的DataSet(DataTable)中如何进行统计呢?特别是通过第三方接口WebService获得了DataSet,这个时候,没有办法去执行Select语句来获取这些统计,怎么办呢?办法总比问题多,其实在DataTable中也是可以进行数据统计的。下面就通过几个简单的示例,介绍一下如何无须通过逐条记录进行计算就可以轻松地获得DataTable中的记录统计结果。这里调用的是功能强大的DataTable的函数Compute。(1)函数说明:publicobjectCompute(stringstrExpression,stringstrFilter);lstrExpression:要计算的表达式字符串,基本上类似于SqlServer中的统计表达式。lstrFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计。(2)调用示例。假设一个产品销售表P_Sell,描述商场中各销售人员的销售记录,如表5-2所示。表5-2产品销售表序号列名数据类型长度主键允许空说明1IDint4√流水号2Namevarchar50√姓名3Sexsmallint2√性别:0为女,1为男4Birthdaydatetime8√生日5ProductIdvarchar20√销售产品代码6Numint4√销售的数量7Pricedecimal9√销售价格l统计所有性别为女的销售员的数量:objectn=table.Compute(count(ID),Sex=0);l统计所有年龄大于20岁的销售员的数量:intc=(int)table.Compute(count(ID),Birthday'DateTime.Today.AddYears(-20)');l统计销售产品的平均价格:decimalap=(decimal)table.Compute(avg(Price),true);l统计产品代码为1的产品销售数量:objectm=table.Compute(sum(Num),ProductId='sj');l统计所有产品的销售总金额:要统计销售总金额,table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如table.Compute(Sum(Quantity*Price),true);。这里有一个问题是,DataTable的统计功能没有SqlServer强大,这个写法是错误的!因为Compute的统计不具备Sum(Quantity*Price)这样的数据的功能。那怎么办呢?对于这样复杂数据的统计,我们可以通过在DataTable中创建一个新的DataColumn来完成,比如为“total”,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了。DataColumndc=newDataColumn(total,Type.GetType(System.Decimal));dc.Expression=Num*Price;table.Columns.Add(dc);objects=table.Compute(sum(total),true);当然,这个功能也可以通过DataGrid增加一个模板列,在ItemDataBind事件里实现计算。4.合并两个DataTable表的数据DataTabledt1=ds.Tables[0];DataTabledt2=ds.Tables[1];dt1.Merge(dt2,true,MissingSchemaAction.AddWithKey);5.DataView类(1)得到DataView。DataViewdv=ds.Tables[0].DefaultView;//或DataViewdv=newDataView(ds.Tables[Product],ID52,IDDESC,DataViewRowState.CurrentRows);(2)得到DataView的行数据。foreach(DataRowViewrowviewindv){for(inti=0;idv.Table.Columns.Count;i){Response.Write(rowview[i]br);}}(3)对结果集过滤排序。DataViewdv=ds.Tables[0].DefaultView;dv.RowFilter=ID52;dv.Sort=IDDESC;intc=dv.Count;if(c51){for(intn=50;nc;n){dv.Delete(n);}}this.DataGrid1.DataSource=dv;详解DataSet和DataTable1、创建DataSet对象:DataSetds=newDataSet(DataSetName);2、查看调用SqlDataAdapter.Fill创建的结构da.Fill(ds,Orders);DataTabletbl=ds.Table[0];foreach(DataColumncolintbl.Columns)Console.WriteLine(col.ColumnName);3、查看SqlDataAdapter返回的数据①、DataRow对象DataTabletbl=ds.Table[0];DataRowrow=tbl.Row[0];Console.WriteLine(ros[OrderID]);②、检查存储在DataRow中的数据DataTabletbl=row.Table;foreach(DataColumncolintbl.Columns)Console.WriteLine(row[col]);③、检查DatTable中的DataRow对象foreach(DataRowrowintbl.Rows)DisplayRow(row);4、校验DataSet中的数据①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。③、用SqlDataAdapter.Fill模式来检索模式信息5、编写代码创建DataTable对象①、创建DataTable对象:DataTabletbl=newDataTable(TableName);②、将DataTable添加到DataSet对象的Table集合双击代码全选1234567891011DataSetds=newDataSet();DataTabletbl=newDataTable(Customers);ds.Tables.Add(tbl);DataSetds=newDataSet();DataTabletbl=ds.Tables.Add(Customers);DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。③、为DataTable添加列双击代码全选123456DataTabletbl=ds.Tables.Add(Orders);DataColumncol=tbl.Columns.Add(OrderID,typeof(int));col.AllowDBNull=false;7891011col.MaxLength=5;col.Unique=true;tbl.PrimaryKey=newDataColumn[]{tbl.Columns[CustomersID]};当设置主键时,AllowDBNull自动设置为False;④、处理自动增量列双击代码全选12345678910111213DataSetds=newDataSet();DataTabletbl=ds.Tables.Add(Orders);DataColumncol=tbl.Columns.Add(OrderID,typeof(int));col.AutoIncrement=true;col.AutoIncrementSeed=-1;col.AutoIncrementStep=-1;col.ReadOnly=true;⑤、添加基于表达式的列tbl.Columns.Add(ItemTotal,typeof(Decimal),Quantity*UnitPrice);6、修改DataTable内容①、添加新DataRow双击代码全选1234567891011DataRowrow=ds.Tables[Customers].NewRow();row[CustomerID]=ALFKI;ds.Tables[Customers].Rows.Add(row);object[]aValues={ALFKI,Alfreds,Anders,030-22222};da.Tables[Customers].LoadDataRow(aValues,false);②、修改当前行修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。双击代码全选

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功