一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件进行多次查廛或排序时, 使用这种方式显然对程序的性能影响将会是十分明显的, 在网上找了一下, 发现DATAVIEW能很好的解决这个问题, 其提供了一种简单直观的方式来操作数据, 如下面代码:
SqlConnection conn = new SqlConnection("server=.;database=mydata;uid=sa;pwd=123456;"); Response.Write(ds.Tables[0].DefaultView.Count); //显增当前查询结果的总行数 this.GridView1.DataSource = ds.Tables[0]; //绑定到gridview数据源 其中如果我们需要变更查询结结果, 例如得到所有goodsID字段大于10的数据, 则只需改变上面代码中的 ds.Tables[0].DefaultView.RowFilter = "Shopid = 1"; 取可, 而不需要同数据库服务器进行更多的交互操作, 从而一定程度上加快程序的执行, 而代码也简结 可能大家都知道dataview这个名词的概念,但也许不是很多人可以说清楚在.net架构中它的应用范围和程度。比如:究竟datagrid和repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过dataset。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢?
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的消耗。 绑定控件的时候,觉得DataSet已经很方便了,但是为什么还有DataView呢?使用DataView操作离线数据库更加方便。以下的文章也解释了如何才可以使用DataView更新回DataSet: 当使用数据视图时,可以通过从数据视图获取已筛选或排序记录(而不是直接从其所在的表中获取)来访问这些记录。在遵守某些限制的情况下,还可以通过数据视图更新、插入和删除记录:
查找记录 读取记录
DataView dataView1 = new DataView(ds.Customers);
string cname = dataView1[0]["CustomerName"].ToString(); 更新记录
dataView1[0]["CompanyName"] = "Fabrikam, Inc.";
DataRowView drv; drv = dataView1.AddNew(); 注:不同于对DataSet的操作
// C#
DataRowView drv; drv = dataView1.AddNew(); drv["CustomerID"] = "AAA"; drv["CompanyName"] = "AAFabrikam, Inc."; drv["City"] = "Aurora";
// C#
dataView1.Delete(0); |
简介DefaultView
最新推荐文章于 2020-12-29 09:13:36 发布