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 的实用作用)