.net 之DATATABLE,DATAVALUE

 每一个 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的函数 Comput
(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>");
        }      
}

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值