每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(Column Name)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序(DataView)信息组成。

DataView用来在观察数据时提供排序和过滤的功能。DataColumn用来对表中的数据值进行一定的规限。比如哪一列数据的默认值是什么、哪一列数据值的范围是什么、哪个是主键、数据值是否是只读等。

由于一个DataSet可能存在多张表,这些表可能存在关联关系,因此用parentRelations和childRelations来表述。ParentRelations表是父表,childRelations是子表,子表是对父表的引用,这样就使得一个表中的某行与另一个表中的某一行甚至整个表相关联。

1.DataTableCollection 类

表示 DataSet 的表的集合。

DataTableCollection dtc = ds.Tables;

DataTable customerTable = 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)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。

string strExpr = "ID>52";

string strSort = "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)函数说明:

public object 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岁的销售员的数量:

int c=(int)table.Compute("count(ID)",

"Birthday<'" DateTime.Today.AddYears(-20) "'");

l         统计销售产品的平均价格:

decimal ap=(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,这样我们就可以使用统计功能了。

DataColumn dc = new DataColumn("total", Type.GetType("System.Decimal"));

dc.Expression = "Num*Price";

table.Columns.Add(dc);

object s=table.Compute("sum(total)", "true");

当然,这个功能也可以通过 DataGrid增加一个模板列,在ItemDataBind事件里实现计算。

4.合并两个DataTable表的数据

DataTable dt1 = ds.Tables[0];

DataTable dt2 = ds.Tables[1];

dt1.Merge(dt2, true, MissingSchemaAction.AddWithKey);

5.DataView 类

(1)得到DataView。

DataView dv = ds.Tables[0].DefaultView;

//或

DataView dv = 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)对结果集过滤排序。

DataView dv = 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;

DataSet和DataTable有用的方法的更多相关文章

  1. C# DataSet和DataTable详解

    1.C# DataSet和DataTable详解:http://www.cnblogs.com/top5/archive/2009/04/23/1441765.html 2.DataSet和DataT ...

  2. .NET DataSet、DataTable操作记录

    一直在习惯.net的编程思维,或是说C#吧.因为前几年一直在用PHP做站,现在用.net很不习惯,主要C#都依赖对控件.类的熟悉,不然很多功能都实现不了. 需求 最近做了一功能,从SQL Server ...

  3. SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释

    一.SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释:根据datatable名填充Dataset.myda.Fill(ds, ...

  4. DataSet与DataTable对象

    DataSet与DataTable对象 摘自:http://www.cnblogs.com/fttbfttb/articles/1509662.html DataSet对象 DataSet是ADO.N ...

  5. 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)

    public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...

  6. ADO.NET基础02(语句参数化,配置文件,DataSet与DataTable)

    ADO.NET连接池 ado.net默认启用了连接池 *如何清空连接池?Connection的静态方法ClearAllPools(). ClearPool() Ado.net连接池使用总结: 1.第一 ...

  7. 关于PagedDataSource分页属性与DataSet和DataTable详解

    Asp.net提供了三个功能强大的列表控件:DataGrid.DataList和Repeater控件,但其中只有DataGrid控件提供分页功能.相对DataGrid,DataList和Repeate ...

  8. DataSet、DataTable、DataRow 复制

    DataSet.DataTable.DataRow 复制 DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个Da ...

  9. C#中的DataSet添加DataTable问题

    最近在使用DataTable来给前台控件绑定数据,开始时查了网上的一些给DataSet添加DataTable时需要注意的地方,一般都要添加表名并且使用DataTable.Copy()方法,否则会报错, ...

随机推荐

  1. sgu 129 Inheritance 凸包,线段交点,计算几何 难度:2

    129. Inheritance time limit per test: 0.25 sec. memory limit per test: 4096 KB The old King decided ...

  2. 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化

    给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化 标签: ajaxdictionaryjsonobject服务器function 2012-07-25 18:41 2242人阅读  ...

  3. restful 初探

    1.restful 是一种编程规范,能够实现现在丰富的客户端(安卓,ios,桌面等)平等的访问服务器提供的服务. 2.重要的是利用restful来设计实现 符合该编程规范的api.

  4. IE 11 回车事件代码不起作用但是在chrom可以正常运行解决办法

    今天遇到这个问题,搞半天开始以为是代码写错了,后面拿到chrom上执行发现是正常的,就是这段代码 function EnterPress(){          if(event.keyCode == ...

  5. spring aop 的理解

    spring aop的相关概念(所有的概念都是为了生成代理类这个过程所需要的信息的抽象): 1.Targer:目标对象.被代理的对象. 2.Advice:增强/通知.就是为目标对象扩展的功能.分为前置 ...

  6. Log4j在Java工程中使用方法

    Eclipse新建Java工程,工程目录如下 1.下载log4j的Jar包,在Java工程下新建lib文件夹,将jar包拷贝到此文件夹,并将其加入到路径中,即:Jar包上右键——Build Path— ...

  7. nginx对上传文件大小的限制

    前几天项目组的一个小伙子过来跟我说,他本地上传的文件没问题,但是在测试环境上测试的时候上传失败. 后来发现时nginx对上传文件的大小做了限制,默认是1M,那么按照需求我们更改了限值为20M vi c ...

  8. OC基础:实例变量和成员变量的区别 分类: ios学习 OC 2015-06-14 17:59 16人阅读 评论(0) 收藏

    摘要:  Objective-C  引入了"实例变量"的概念,但同时, 也经常出现 "成员变量"的声音. 到底什么是实例变量,什么是成员变量,二者的区别是什么呢 ...

  9. C# 跨线程更新UI界面的适当的处理方式,友好的退出界面的机制探索

    本文主要讲讲C#窗体的程序中一个经常遇到的情况,就是在退出窗体的时候的,发生了退出的异常. 工业软件技术交流群:群1:592132877(满)  群2:948305931     欢迎技术探讨 我们先 ...

  10. 计算 S=a+aa+aaa+aaaa+a.......a【转载】

    package java算法; import java.util.Scanner; /* * 计算 S=a+aa+aaa+aaaa+a.......a */ public class numadd { ...