DataSet和DataTable使用的方法

每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(Column Name)、数据格(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("ID>52");

(3)获取符合筛选条件的行,并按指定的排序条件排序。

DataRow[]rows = dt.Select("ID>52","ID DESC");

(4)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。

stringstrExpr = "ID>52";

stringstrSort = "ID DESC";

DataRow[]foundRows = dt.Select(strExpr, strSort, DataViewRowState.OriginalRows);

3.DataTable进行数据统计

我们在使用SQL Server时,可以轻松地对数据进行Sum、Aver、Count等操作以获得统计结果,那么,在已经把数据检索出来的DataSet(DataTable)中如何进行统计呢?特别是通过第三方接口Web Service获得了DataSet,这个时候,没有办法去执行Select语句来获取这些统计,怎么办呢?

办法总比问题多,其实在DataTable中也是可以进行数据统计的。

下面就通过几个简单的示例,介绍一下如何无须通过逐条记录进行计算就可以轻松地获得DataTable中的记录统计结果。这里调用的是功能强大的DataTable的函数Compute。

(1)函数说明:

publicobject Compute(string strExpression,string strFilter);

l        strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。

l        strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计。

(2)调用示例。

假设一个产品销售表P_Sell,描述商场中各销售人员的销售记录,如表5-2所示。

表5-2  产品销售表

序号

列名

数据类型

长度

主键

允许空

说明

1

ID

int

4

 

流水号

2

Name

varchar

50

 

姓名

3

Sex

smallint

2

 

性别:0为女,1为男

4

Birthday

datetime

8

 

生日

5

ProductId

varchar

20

 

销售产品代码

6

Num

int

4

 

销售的数量

7

Price

decimal

9

 

销售价格

l        统计所有性别为女的销售员的数量:

object n =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的产品销售数量:

object m =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 = new DataColumn("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 = new DataView(ds.Tables["Product"], "ID > 52","ID DESC",

DataViewRowState.CurrentRows);

(2)得到DataView的行数据。

foreach(DataRowView rowview in dv)

{

   for (int i = 0; i < dv.Table.Columns.Count; i )

   {

       Response.Write(rowview[i] "<br>");

   }   

}

(3)对结果集过滤排序。

DataViewdv = ds.Tables[0].DefaultView;

dv.RowFilter= "ID > 52";

dv.Sort ="ID DESC";

int c =dv.Count;

if (c >51)

{

   for (int n = 50; n < c; n )

   {

       dv.Delete(n);

   }

}

this.DataGrid1.DataSource = dv;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C#DataSetDataTable是非常常用的数据存储和处理工具,下面是一些应用实例: 1. 数据库查询结果存储 在C#,我们可以使用DataSetDataTable来存储数据库查询结果。例如,我们可以使用DataAdapter类从数据库检索数据,并将结果存储在DataTable。然后,我们可以使用DataTable方法和属性来处理和操作这些数据。 2. 数据导入和导出 DataSetDataTable也可以用于数据导入和导出。例如,我们可以使用DataTable的WriteXml方法将数据保存为XML文件,然后使用ReadXml方法将数据加载回DataTable。同样,我们也可以使用DataSet的WriteXml和ReadXml方法来导入和导出数据。 3. 数据筛选和排序 使用DataTable的Select方法可以筛选出符合条件的数据行,而使用DataTable的Sort方法可以对数据进行排序。这些方法可以帮助我们快速地处理和分析数据。 4. 数据绑定 DataSetDataTable也可以用于数据绑定。例如,我们可以使用DataGrid控件将DataTable的数据绑定到一个,然后可以对格进行排序、筛选和编辑操作。 总之,DataSetDataTable是C#非常有用的数据存储和处理工具,可以帮助我们快速地处理和分析数据。 ### 回答2: 很抱歉,我需要更多的上下文信息才能回答您提出的问题。请提供更多的信息。 ### 回答3: 抱歉,您的问题似乎缺少了一部分内容,无法理解您想要询问的具体问题。请您提供更详细的问题或背景信息,我将尽力为您提供准确的答案和帮助。谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值