DefaultView 的作用 收藏
一直以來(lái)在對(duì)數(shù)據(jù)進(jìn)行排序, 條件查詢都是直接重復(fù)構(gòu)建SQL來(lái)進(jìn)行, 在查詢次數(shù)和數(shù)據(jù)量不多的情況下倒沒(méi)覺(jué)得什么, 但慢慢得, 當(dāng)程序需要對(duì)大量數(shù)據(jù)椐不同條件進(jìn)行多次查廛或排序時(shí), 使用這種方式顯然對(duì)程序的性能影響將會(huì)是十分明顯的, 在網(wǎng)上找了一下, 發(fā)現(xiàn)DATAVIEW能很好的解決這個(gè)問(wèn)題, 其提供了一種簡(jiǎn)單直觀的方式來(lái)操作數(shù)據(jù), 如下面代碼:
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內(nèi)存數(shù)擾庫(kù)
Response.Write(ds.Tables[0].DefaultView.Count); //顯增當(dāng)前查詢結(jié)果的總行數(shù)
ds.Tables[0].DefaultView.Sort = "GoodsID Desc"; //這里設(shè)定排序的字段及方式
ds.Tables[0].DefaultView.RowFilter = "Shopid = 1"; //設(shè)定過(guò)濾條件, 得到條件潢足為”ShopID =1 的所有數(shù)據(jù)”
this.GridView1.DataSource = ds.Tables[0]; //綁定到gridview數(shù)據(jù)源
this.GridView1.DataBind();
其中如果我們需要變更查詢結(jié)結(jié)果, 例如得到所有goodsID字段大于10的數(shù)據(jù), 則只需改變上面代碼中的
ds.Tables[0].DefaultView.RowFilter = "Shopid = 1";
改為
ds.Tables[0].DefaultView.RowFilter = "goodsID > 10";
取可, 而不需要同數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行更多的交互操作, 從而一定程度上加快程序的執(zhí)行, 而代碼也簡(jiǎn)結(jié)
可能大家都知道dataview這個(gè)名詞的概念,但也許不是很多人可以說(shuō)清楚在.net架構(gòu)中它的應(yīng)用范圍和程度。比如:究竟datagrid和 repeater這些控件是如何和數(shù)據(jù)關(guān)聯(lián)起來(lái)的?很多人會(huì)告訴我是通過(guò)dataset。這顯然是正確的,但究竟最根本最直接的是通過(guò)什么聯(lián)系起來(lái)的呢?
答案就是dataview。其實(shí)下面的語(yǔ)句:
DatagridTC.DataSource = dtRst;
DatagridTC.DataBind();
在工作的時(shí)候,它等效于:
DatagridTC.DataSource = ds.Tables[0].DefaultView;
DatagridTC.DataBind();
dataset都是通過(guò)數(shù)據(jù)視圖將數(shù)據(jù)呈現(xiàn)在控件上面的。那如何才能做到物盡其用呢?如果通過(guò)靈活地使用dataview讓我們的程序更簡(jiǎn)潔,性能更好呢?下面通過(guò)一個(gè)例子來(lái)說(shuō)明:一段程序想實(shí)現(xiàn)將dataset已有的一個(gè)datatable重新排序。
某個(gè)寫法是:
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();
另外一個(gè)寫法是:
DataView dv = ds.Tables[0].DefaultView;
dv.Sort = "TimeClass_Name, DateType, TCOrder";
DatagridTC.DataSource = dv;
DatagridTC.DataBind();
顯然方法二從代碼上就簡(jiǎn)潔多了,更重要的是它不要再新創(chuàng)建dataset等,減少了內(nèi)存和CPU的消耗。
因此大家在遇到需要排序或者過(guò)濾數(shù)據(jù)的時(shí)候,要多想想可否使用dataview來(lái)實(shí)現(xiàn)了。
綁定控件的時(shí)候,覺(jué)得DataSet已經(jīng)很方便了,但是為什么還有DataView呢?使用DataView操作離線數(shù)據(jù)庫(kù)更加方便。以下的文章也解釋了如何才可以使用DataView更新回DataSet:
作用:
當(dāng)使用數(shù)據(jù)視圖時(shí),可以通過(guò)從數(shù)據(jù)視圖獲取已篩選或排序記錄(而不是直接從其所在的表中獲取)來(lái)訪問(wèn)這些記錄。在遵守某些限制的情況下,還可以通過(guò)數(shù)據(jù)視圖更新、插入和刪除記錄:
數(shù)據(jù)視圖必須包含有關(guān)每個(gè)記錄的足夠信息,以便能夠確定記錄在數(shù)據(jù)表中的位置。這些信息可以包含一個(gè)主鍵或其他列(這些列合在一起可以提供足夠的信息來(lái)唯一標(biāo)識(shí)記錄,如客戶名稱、地址和城市)。
對(duì)于每個(gè)操作,數(shù)據(jù)視圖的 AllowEdit、AllowNew 和 AllowDelete 屬性必須相應(yīng)設(shè)置為 true。
查找記錄
查找數(shù)據(jù)視圖中的記錄
將數(shù)據(jù)視圖的 Sort 屬性設(shè)置為您要搜索的一列或多列。
調(diào)用數(shù)據(jù)視圖的 Find 或 FindRows 方法,傳遞該它要在排序后的列中進(jìn)行查找的值。
如果想要查找單個(gè)記錄,則調(diào)用 Find 方法。
- 或 -
如果想要查找多個(gè)記錄,則使用 FindRows 方法。
dataView1.Sort = "CustomerID";
int foundIndex = dataView1.Find(textBox1.Text);
注:使用Find方法應(yīng)先Sort
讀取記錄
讀取數(shù)據(jù)視圖中的記錄
使用索引值指向數(shù)據(jù)視圖中要訪問(wèn)的記錄。
可以通過(guò)在數(shù)據(jù)視圖中按名稱引用列來(lái)訪問(wèn)列,如下面的示例所示,它獲取視圖中第一個(gè)記錄的客戶名稱:
DataView dataView1 = new DataView(ds.Customers);
string cname = dataView1[0]["CustomerName"].ToString();
更新記錄
通過(guò)數(shù)據(jù)視圖更新記錄
在代碼中,使用索引值標(biāo)識(shí)要更新的記錄,然后通過(guò)引用列名稱來(lái)設(shè)置列值。
注意 如果數(shù)據(jù)視圖的 AllowEdit 屬性設(shè)置為 false,則不能通過(guò)數(shù)據(jù)視圖編輯記錄。
下面的示例說(shuō)明如何標(biāo)識(shí)和更新一列。
dataView1[0]["CompanyName"] = "Fabrikam, Inc.";
插入記錄
通過(guò)數(shù)據(jù)視圖插入記錄
調(diào)用數(shù)據(jù)視圖的 AddNew 方法,它創(chuàng)建新記錄并返回一個(gè) DataRowView 對(duì)象:
DataRowView drv;
drv = dataView1.AddNew();
注:不同于對(duì)DataSet的操作
像更新任何數(shù)據(jù)視圖記錄一樣來(lái)更新記錄。
注意 如果數(shù)據(jù)視圖的 AllowNew 屬性設(shè)置為 false,則不能通過(guò)數(shù)據(jù)視圖插入記錄。
下面的示例展示如何向視圖添加新記錄,更新其中的三個(gè)字段:
// C#
DataRowView drv;
drv = dataView1.AddNew();
drv["CustomerID"] = "AAA";
drv["CompanyName"] = "AAFabrikam, Inc.";
drv["City"] = "Aurora";
刪除記錄
通過(guò)數(shù)據(jù)視圖刪除記錄
調(diào)用數(shù)據(jù)視圖的 Delete 方法,向其傳遞要刪除記錄的索引:
注意 如果數(shù)據(jù)視圖的 AllowDelete 屬性設(shè)置為 false,則不能通過(guò)數(shù)據(jù)視圖刪除記錄。
下面的示例說(shuō)明如何刪除一條記錄:
// C#
dataView1.Delete(0);
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yuanhaoan/archive/2009/04/13/4069014.aspx