设为首页 | 加入收藏

网站建设报价咨询,网站建设A套餐 网站建设报价咨询,网站建设B套餐 网站建设报价咨询,网站建设C套餐 网站建设报价咨询
网站建设知识
网络整合营销外包,长沙网站建设
您目前的位置:森达网络 >>网站建设知识
网站建设知识

长沙网站建设公司专业分析DataSet与DataTable的区别

本文来源: DataSet与DataTable的区别      本文作者:DataSet与DataTable的区别      发布时间:2017-09-14


 
长沙做网站在开发网站的代码实施过程中需要读取存储数据,在这个过程中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);

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

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

(2)调用示例。
 

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

object n = table.Compute("count(ID)", "Sex = 0");

统计所有年龄大于20岁的销售员的数量:

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

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

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

decimal ap=(decimal)table.Compute("avg(Price)", "true");

统计产品代码为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就一定要用强类型DataSet,否则弱类型的DataSet还不如DataTable呢,更耗开销。强类型DataSet最大的好处就是里面的值类型都是既定的,如果在程序中赋值或取值时数据类型不对,会在编译期就发现错误,有利于程序的稳定性和健壮性。但开销明显大于弱类型DataSet和DataTable。肯定会影响客户端的速度,这就要看你如何取舍了。要是数据量大,用强类型DataSet反而很合适,因为强类型的结构和约束占的开销就那些,你放一个数据也这样,放一万个数据也这样,所以数据量越大越适合用强类型DataSet,本文由
长沙专业做网站公司整理,转载请注明www.sendawangluo.com

版权所有:长沙森达网络工作室2011-2016 All Rights Reserved 地址:长沙市岳麓区中电软件园总部大楼 网站备案号:湘ICP备11005944号