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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM