DataSet和DataTable有用的方法
每一个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有用的方法的更多相关文章
- C# DataSet和DataTable详解
1.C# DataSet和DataTable详解:http://www.cnblogs.com/top5/archive/2009/04/23/1441765.html 2.DataSet和DataT ...
- .NET DataSet、DataTable操作记录
一直在习惯.net的编程思维,或是说C#吧.因为前几年一直在用PHP做站,现在用.net很不习惯,主要C#都依赖对控件.类的熟悉,不然很多功能都实现不了. 需求 最近做了一功能,从SQL Server ...
- SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释
一.SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释:根据datatable名填充Dataset.myda.Fill(ds, ...
- DataSet与DataTable对象
DataSet与DataTable对象 摘自:http://www.cnblogs.com/fttbfttb/articles/1509662.html DataSet对象 DataSet是ADO.N ...
- 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)
public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...
- ADO.NET基础02(语句参数化,配置文件,DataSet与DataTable)
ADO.NET连接池 ado.net默认启用了连接池 *如何清空连接池?Connection的静态方法ClearAllPools(). ClearPool() Ado.net连接池使用总结: 1.第一 ...
- 关于PagedDataSource分页属性与DataSet和DataTable详解
Asp.net提供了三个功能强大的列表控件:DataGrid.DataList和Repeater控件,但其中只有DataGrid控件提供分页功能.相对DataGrid,DataList和Repeate ...
- DataSet、DataTable、DataRow 复制
DataSet.DataTable.DataRow 复制 DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个Da ...
- C#中的DataSet添加DataTable问题
最近在使用DataTable来给前台控件绑定数据,开始时查了网上的一些给DataSet添加DataTable时需要注意的地方,一般都要添加表名并且使用DataTable.Copy()方法,否则会报错, ...
随机推荐
- Sql Server约束的学习一(主键约束、外键约束、唯一约束)
一.约束的分类 1.实体约束 实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束. 2.域约束 域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束. 3.参照完整性约束 ...
- 0001——初涉MySQL
MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版本和企业版 MySQL安装方式: 1.MSI安装(Windows Installer) 2.ZIP安装 选择安装类型: 1.T ...
- learngin uboot design parameter recovery mechanism
pseudocode: if( getenv(“uboot_env_init”) != NULL){ if(uboot_env_init != HAVE_INIT){ Set uboot_en ...
- 指针和const一些注意事项
1.常量指针(底层const) 指向常量的指针,指针所指向的对象的值无法被修改,若想存放常量对象的地址,只能使用指向常量的指针. 2.指针常量(顶层const) 指针本身是常量,指针本身的值不可修改. ...
- 使用OpenSSL生成证书并配置Https
1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念.我们以申请证书的流程说明三者的关系.客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步 ...
- PAIR PROJECTS 附加题
[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 答:首先,就原有的StopAtEach方法而言,此算法的实现既是非常低 ...
- v-text、v-html、v-cloak、v-pre.md
本篇文章,我们简单的介绍几个Vue内置指令的实现. v-text v-text的用法很简单,以下两个表达式的作用相同. <span v-text="msg"></ ...
- UDP广播与多播
UDP广播与多播 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去.至于服务 ...
- Android RIL的java框架
Android RIL的Java部分也被分为了两个模块,RIL模块与Phone模块.其中RIL模块负责进行请求以及相应的处理,它将直接与RIL的原声代码进行通信.而Phone模块则向应用程序开发者提供 ...
- 一起来点React Native——常用组件之TextInput
一.前言 文本输入框,相当于OC中的UITextField,在用法和属性方面,两者都有很大的借鉴之处:通过键盘将文本输入到应用程序的一个基本的组件: 二.TextInput的常见属性 因为TextIn ...