zoukankan      html  css  js  c++  java
  • DefaultView 的作用(对DataSet查询出的来数据进行排序)

    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);

  • 相关阅读:
    MySQL基础知识总结
    PHP常见算法
    PHP程序功能设计
    SVN配置使用及移植
    推荐一个SpringBoot + Vue + MyBatis 音乐网站项目
    累积sql常用查询语句「Oracle」
    Nginx服务器设置http/https正向代理,使用ngx_http_proxy_connect_module模块
    squid配置文件
    nginx命令
    k8s与Docker有啥关系
  • 原文地址:https://www.cnblogs.com/shouyeren/p/6518581.html
Copyright © 2011-2022 走看看