DefaultView 的作用 收藏
   一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件进行多次查廛或排序时, 使用这种方式显然对程序的性能影响将会是十分明显的, 在网上找了一下, 发现DATAVIEW能很好的解决这个问题, 其提供了一种简单直观的方式来操作数据, 如下面代码:

SqlConnection conn = new SqlConnection("server=.;database=mydata;uid=sa;pwd=123456;");
        conn.Open();
        SqlDataAdapter adp = new SqlDataAdapter();
        adp.SelectCommand = new SqlCommand("select * from goods",conn);
        DataSet ds = new DataSet();
        adp.Fill(ds, "goods"); //填充DataSet内存数扰库

Response.Write(ds.Tables[0].DefaultView.Count); //显增当前查询结果的总行数
        ds.Tables[0].DefaultView.Sort = "GoodsID Desc"; //这里设定排序的字段及方式
        ds.Tables[0].DefaultView.RowFilter = "Shopid = 1"; //设定过滤条件, 得到条件潢足为”ShopID =1 的所有数据”

this.GridView1.DataSource = ds.Tables[0]; //绑定到gridview数据源
        this.GridView1.DataBind();

其中如果我们需要变更查询结结果, 例如得到所有goodsID字段大于10的数据, 则只需改变上面代码中的

ds.Tables[0].DefaultView.RowFilter = "Shopid = 1";
        改为
        ds.Tables[0].DefaultView.RowFilter = "goodsID > 10";

取可, 而不需要同数据库服务器进行更多的交互操作, 从而一定程度上加快程序的执行, 而代码也简结

可能大家都知道dataview这个名词的概念,但也许不是很多人可以说清楚在.net架构中它的应用范围和程度。比如:究竟datagrid和 repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过dataset。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢?

答案就是dataview。其实下面的语句:

DatagridTC.DataSource = dtRst;
DatagridTC.DataBind();
在工作的时候,它等效于:

DatagridTC.DataSource = ds.Tables[0].DefaultView;
DatagridTC.DataBind();

dataset都是通过数据视图将数据呈现在控件上面的。那如何才能做到物尽其用呢?如果通过灵活地使用dataview让我们的程序更简洁,性能更好呢?下面通过一个例子来说明:一段程序想实现将dataset已有的一个datatable重新排序。

某个写法是:

dt = ds.Tables[0].Copy();
                 dt.Clear();

int intNewID = 0;
                for(int intI = 0;intI < ds.Tables[0].Rows.Count;intI++)
                {
                     dr = dt.NewRow();
                     dr["DateType"] = ds.Tables[0].Rows[intI - 1 + 1]["DateType"].ToString();
                     dr["TCOrder"] = ds.Tables[0].Rows[intI - 1 + 1]["TCOrder"].ToString();
                     dr["TimeClass_ID"] = intNewID;
                     dr["TimeClass_Name"] = ds.Tables[0].Rows[intI - 1 + 1]["TimeClass_Name"].ToString();
                     dr["Chn_NameLocal"] = ds.Tables[0].Rows[intI - 1 + 1]["Chn_NameLocal"].ToString();
                     dr["User_Name"] = ds.Tables[0].Rows[intI - 1 + 1]["User_Name"].ToString();
                     dr["User_ID"] = ds.Tables[0].Rows[intI - 1 + 1]["User_ID"].ToString();
                     dt.Rows.Add(dr);
                     dt.AcceptChanges();
                     intNewID++;
                 }

dtRst = dt.Copy();
                 dtRst.Clear();
                 FoundRow = dt.Select("1 = 1", "TimeClass_Name, DateType, TCOrder");
                for(int intI = 0;intI < FoundRow.Length;intI++)
                {
                     dr = dtRst.NewRow();
                     dr["DateType"] = FoundRow[intI]["DateType"].ToString();
                     dr["TCOrder"] = FoundRow[intI]["TCOrder"].ToString();
                     dr["TimeClass_ID"] = FoundRow[intI]["TimeClass_ID"].ToString();
                     dr["TimeClass_Name"] = FoundRow[intI]["TimeClass_Name"].ToString();
                     dr["Chn_NameLocal"] = FoundRow[intI]["Chn_NameLocal"].ToString();
                     dr["User_Name"] = FoundRow[intI]["User_Name"].ToString();
                     dr["User_ID"] = FoundRow[intI]["User_ID"].ToString();
                     dtRst.Rows.Add(dr);
                     dtRst.AcceptChanges();
                 }

DatagridTC.DataSource = dtRst;
                 DatagridTC.DataBind();

另外一个写法是:

DataView dv = ds.Tables[0].DefaultView;
                 dv.Sort = "TimeClass_Name, DateType, TCOrder";
                 DatagridTC.DataSource = dv;
                 DatagridTC.DataBind();
显然方法二从代码上就简洁多了,更重要的是它不要再新创建dataset等,减少了内存和CPU的消耗。

因此大家在遇到需要排序或者过滤数据的时候,要多想想可否使用dataview来实现了。

绑定控件的时候,觉得DataSet已经很方便了,但是为什么还有DataView呢?使用DataView操作离线数据库更加方便。以下的文章也解释了如何才可以使用DataView更新回DataSet:
作用:

当使用数据视图时,可以通过从数据视图获取已筛选或排序记录(而不是直接从其所在的表中获取)来访问这些记录。在遵守某些限制的情况下,还可以通过数据视图更新、插入和删除记录:

数据视图必须包含有关每个记录的足够信息,以便能够确定记录在数据表中的位置。这些信息可以包含一个主键或其他列(这些列合在一起可以提供足够的信息来唯一标识记录,如客户名称、地址和城市)。
对于每个操作,数据视图的 AllowEdit、AllowNew 和 AllowDelete 属性必须相应设置为 true。
查找记录
查找数据视图中的记录
将数据视图的 Sort 属性设置为您要搜索的一列或多列。
调用数据视图的 Find 或 FindRows 方法,传递该它要在排序后的列中进行查找的值。
如果想要查找单个记录,则调用 Find 方法。
- 或 -
如果想要查找多个记录,则使用 FindRows 方法。
dataView1.Sort = "CustomerID";
int foundIndex = dataView1.Find(textBox1.Text);
注:使用Find方法应先Sort

读取记录
读取数据视图中的记录
使用索引值指向数据视图中要访问的记录。
可以通过在数据视图中按名称引用列来访问列,如下面的示例所示,它获取视图中第一个记录的客户名称:

DataView dataView1 = new DataView(ds.Customers);
string cname = dataView1[0]["CustomerName"].ToString();
更新记录
通过数据视图更新记录
在代码中,使用索引值标识要更新的记录,然后通过引用列名称来设置列值。
注意   如果数据视图的 AllowEdit 属性设置为 false,则不能通过数据视图编辑记录。
下面的示例说明如何标识和更新一列。

dataView1[0]["CompanyName"] = "Fabrikam, Inc.";

插入记录
通过数据视图插入记录
调用数据视图的 AddNew 方法,它创建新记录并返回一个 DataRowView 对象:

DataRowView drv;
drv = dataView1.AddNew();
注:不同于对DataSet的操作
像更新任何数据视图记录一样来更新记录。
注意   如果数据视图的 AllowNew 属性设置为 false,则不能通过数据视图插入记录。
下面的示例展示如何向视图添加新记录,更新其中的三个字段:

// C#
DataRowView drv;
drv = dataView1.AddNew();
drv["CustomerID"] = "AAA";
drv["CompanyName"] = "AAFabrikam, Inc.";
drv["City"] = "Aurora";

删除记录
通过数据视图删除记录
调用数据视图的 Delete 方法,向其传递要删除记录的索引:
注意   如果数据视图的 AllowDelete 属性设置为 false,则不能通过数据视图删除记录。
下面的示例说明如何删除一条记录:

// C#
dataView1.Delete(0);

DefaultView 的作用(对DataSet查询出的来数据进行排序)的更多相关文章

  1. Saiku根据入参日期查询出对应的数据(二十)

    Saiku根据入参日期查询出对应的数据 之前好像有写过一篇博客关于saiku date range的,现在进一步更新啦!!! 这里的日期筛选会更完善一些,需要提供两个参数 开始日期与结束日期(star ...

  2. SQL查询出一个表数据插入到另一个表里

    下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...

  3. php 将查询出的数组数据存入redis

    我们从数据库查询出来的数据一般为数组的形式, 而redis是不支持存入数组的, 一种解决办法是将数组转化为json数据,再将json存入redis,之后取出时再将json转化为php数组. 但将取出的 ...

  4. Mybatis关联一对多映射不能查询出所有的数据的问题

    在使用Mybatis进行一对多查询时,如果返回的是一个对象的话,可以发现将一对多的数据全都取出来了,但是这样的缺点是有很多值为null,我们更喜欢将返回值设为Map的形式,这样可以去除那些多余null ...

  5. 在PHP中对查询出得数据库数据进行json编码

    select.php <?php $con = mysql_connect("localhost","Thh","920920thh" ...

  6. oracle数据库查询出多条数据,合并,之后列转行

    select B.enterprise_code, B.enterprise_name, sum(B.h0_overnum) AS over00, sum(B.h1_overnum) AS over0 ...

  7. sql 查询出当天记录数据

    select updatetime,NewComment,HistoryID,sum(1) over(partition by UpdateTime) from LPProjectHistoryord ...

  8. SQL Server数据库Union和Union All查询出数据的区别?

    好久没有更新博客了,可能是最近比较忙,总是忽略了一些事情,今天查了做了一些数据分析的数据,突然感觉对Union和Union all有些不太理解了,可能是自己老了吧,就翻了一些资料,进行回忆和学习,趁着 ...

  9. MySql——创建数据表,查询数据,排序查询数据

    参考资料:<Mysql必知必会> 创建数据表 在学习前首先创建数据表和插入数据.如何安装mysql可以看看上个博客https://www.cnblogs.com/lbhym/p/11675 ...

随机推荐

  1. How to get the MouseEvent coordinates for an element that has CSS3 Transform?

    I want to detect where a MouseEvent has occurred, in coordinates relative to the clicked element. Wh ...

  2. 浅谈SaaS应用开发的难度

    近期做SaaS应用的非常多,这样的模式是未来的一种趋势,这样的模式的最大优点就是云计算的优点--节约资源.网上有非常多人觉得SaaS非常easy,就是一个多用户租赁模式.这样的认识也不能说不正确.由于 ...

  3. HDOJ 5299 Circles Game 圆嵌套+树上SG

    将全部的圆化成树,然后就能够转化成树上的删边博弈问题.... Circles Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  4. vue 结合 echarts

    http://blog.csdn.net/mr_wuch/article/details/70225364

  5. Composer使用实践

    Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们. 地址在这里 库地址 这里相当于php应用商店,存放着很多库. 这些库,基本上 ...

  6. 服务器共享session的方式

    服务器共享session的方式 简介 1. 基于NFS的Session共享 NFS是Net FileSystem的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发.这个方案实现最为简单, ...

  7. Android TextView加上阴影效果

    <TextView android:id="@+id/test_shadow" android:layout_width="wrap_content" a ...

  8. windows下安装mycat,并简单使用

    使用mycat需要先安装jdk1.7以上 参考:http://www.cnblogs.com/llhhll/p/9257764.html 1从官网下载解压后目录如下(1.6版本) 下载地址:https ...

  9. eclipse oxygen离线安装activiti

    我用的最新版本的eclipse oxygen,结果通过help-->install new software-->add 一直报找不到,后来网上查找的离线安装,终于成功了,在这里和大家分享 ...

  10. 捕捉soap的xml形式

    下面是我以前对Php的soap接口进行抓包分析出的结果,这个分析在当服务端或者客户端的Php没有安装soap模块时,可以使用构建xml的方式实现相同的功能 服务端: $data = $HTTP_RAW ...