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
作用:

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

数据视图包含有关每记录的足信息,以便能确定记录在数据表中的位置。些信息可以包含一个主或其他列(些列合在一起可以提供足的信息来唯一标识记录,如客名称、地址和城市)。
个操作,数据视图 AllowEditAllowNew 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);

本文来自CSDN博客,转载请标明出:http://blog.csdn.net/yuanhaoan/archive/2009/04/13/4069014.aspx