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. dotnet core test with NUnit

    https://github.com/nunit/dotnet-test-nunit if you are using Visual Studio. Your project.json in your ...

  2. BZOJ 3175 最大独立集

    思路: 最大独立集嘛 用nlogn的Dinic做 //By SiriusRen #include <queue> #include <cstdio> #include < ...

  3. 使用python进行分页操作

    class getPage: """通过这个类 获取 开始和结束点""" def __init__(self,page): try: sel ...

  4. 学习jvm,关于MAT an internal error occurred during:"Parsing heap dump" from问题

    写了一个死循环不断的创建对象,模拟内存溢出 package com.zuo.test1; import java.util.ArrayList; import java.util.List; publ ...

  5. UVA-12083 Guardian of Decency 二分图 最大独立集

    题目链接:https://cn.vjudge.net/problem/UVA-12083 题意 学校组织去郊游,选择最多人数,使得任意两个人之间不能谈恋爱 不恋爱条件是高差大于40.同性.喜欢的音乐风 ...

  6. [洛谷P1750]KC喝咖啡

    题目大意:给你n个物品,每个物品有一个价值$v_i$和一个时间$t_i$,要你取m个物品,使得他们的美味度($\frac{\sum v_i}{\sum t_i}$)最大,求这个美味度. 解题思路:由于 ...

  7. 浅谈 MySQL的外键的作用

    MySQL中外键的介绍: MySQL外键必须使用存储引擎为  innDB  其中MySAM 和MEMORYH这两种引擎不支持 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的 ...

  8. vue-cli解析

    前言 这段时间,算是空出手来写几篇文章了.由于很久都没有时间整理现在所用的东西了,所以,接下来会慢慢整理出一些文档来记录前段时间的工作和生活. 这篇文章的主题是vue-cli的理解.或许,很多人在开发 ...

  9. 洛谷 P1417 烹调方案 (01背包拓展)

    一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...

  10. 【BZOJ 1059】[ZJOI2007]矩阵游戏

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最后要求对于所有的i,a[i][i]=1 那么,如果第i行的第j列为1. 就说明我们可以把这个第i行换到第j行. 因为这样的话,a[ ...