[C#] DataView用法

來源:互聯網
上載者:User
[C#] DataView用法 - -

                                      

 

     在實際編程工程中,常常遇到這樣的情況:DataTable並不是資料庫中的,或者DataTable尚未寫到資料庫,或者從資料庫中讀出的DataTable已經在本地被改動,又沒有寫回資料庫(可能還要作其他改動),在這些情況下,要查詢DataTable中的資料,強大的SQL語言就派不上用場了。
   
  有些.NET程式員採取在資料庫中建立暫存資料表等方法來解決這類查詢問題。而我覺得這種方法不可行,其實只要用.NET類庫中提供的DataView類的強大功能(主要是用它的RowFilter屬性),就能方便地解決這類查詢問題。下面就舉一個具體的例子,來說明如何不用SQL語句,用DataView的RowFilter屬性來查詢。
   
  步驟一:建立一個C#的ASP.NET項目。先編寫一個產生DataTable的函數MakeDataTable(),代碼如下:
   
   private DataTable MakeTable()    
   {    
        //產生DataTable     
        System.Data.DataTable myDataTable = new DataTable("本機資料表");     
        DataColumn myDataColumn;     
        DataRow myDataRow; 
    
        //產生資料列 ID,商品名稱,商品價格 
    
        myDataColumn = new DataColumn();     
        myDataColumn.DataType = System.Type.GetType("System.Int32");     
        myDataColumn.ColumnName = "ID";     
        myDataColumn.ReadOnly = true;     
        myDataColumn.Unique = true;     
        myDataTable.Columns.Add(myDataColumn);     
             myDataColumn = new DataColumn();     
        myDataColumn.DataType = System.Type.GetType("System.String");     
        myDataColumn.ColumnName = "商品名稱";     
        myDataTable.Columns.Add(myDataColumn);    
             myDataColumn = new DataColumn();     
        myDataColumn.DataType =System.Type.GetType("System.Decimal");     
        myDataColumn.ColumnName = "商品價格";     
        myDataTable.Columns.Add(myDataColumn);     
    
        //為資料表添加資料行   
        myDataRow = myDataTable.NewRow();    
        myDataRow["id"] = 1;     
        myDataRow["商品名稱"] = "足球";     
        myDataRow["商品價格"] =57.5;     
        myDataTable.Rows.Add(myDataRow);    
    
        myDataRow = myDataTable.NewRow();     
        myDataRow["id"] = 2;     
        myDataRow["商品名稱"] = "籃球";     
        myDataRow["商品價格"] =64.5;     
        myDataTable.Rows.Add(myDataRow);   
    
        myDataRow = myDataTable.NewRow();     
        myDataRow["id"] = 3;     
        myDataRow["商品名稱"] = "網球";     
        myDataRow["商品價格"] =6.5;     
        myDataTable.Rows.Add(myDataRow);  
    
        myDataRow = myDataTable.NewRow();     
        myDataRow["id"] = 4;     
        myDataRow["商品名稱"] = "網球拍";     
        myDataRow["商品價格"] =388.5;     
        myDataTable.Rows.Add(myDataRow);        
    
        //返回資料表     
        return myDataTable;     
   }   
   
   
  步驟二:在aspx前台頁面中添加一個DataGrid1,在後台代碼的Page_Load中編寫如下代碼: 
    
     if(!this.IsPostBack)    
     {     
        Session["Table"]=MakeTable();     
        DataGrid1.DataSource=(DataTable)Session["Table"];     
        DataGrid1.DataBind();     
   }  
   
   
  此時瀏覽頁面,可以看到DataGrid中顯示的表中資料。
   
  ID     商品名稱         商品價格    
  1       足球             57.5     
  2       籃球             64.5     
  3       網球             6.5    
  4       網球拍           388.5
   
  步驟三:在aspx前台頁面添加一個用來查詢Label1,TextBox1和Button1。 
    
  步驟四:在查詢按鈕Button1單擊事件中添加如下代碼:
   
   DataTable dt=(DataTable)Session["Table"];     
   //為資料表建立一個資料檢視     
   DataView dv = new DataView(dt);     
   //用RowFilter屬性進行模糊查詢     
   dv.RowFilter="商品名稱 LIKE'%"+TextBox1.Text.Trim()+"%'";     
   DataGrid1.DataSource = dv;     
   DataGrid1.DataBind();
   
  運行頁面後在TextBox1中輸入“網”,按查詢按鈕後 ,DataGrid顯示的查詢結果如下:    
    
    
  ID     商品名稱     商品價格    
  3        網球        6.5    
  4       網球拍      388.5
   
  步驟五:在aspx前台頁面上添加一個Label2控制項,兩個TextBox控制項-TextBox1和TextBox2,以及一個“查詢”按鈕,Button2,如所示,用來查詢使用者輸入的價格範圍中在商品。
   
  步驟六:在後台代碼中為Button2按鈕單擊事件添加如下如下代碼: 
    
     DataTable dt = (DataTable)Session["Table"];     
     DataView dv = new DataView(dt);    
     dv.RowFilter="商品價格>="+TextBox2.Text.Trim()+" AND 商品價格<="+TextBox3.Text.Trim();    
     DataGrid1.DataSource=dv;    
     DataGrid1.DataBind(); 
  
    
  使用者在兩個文字框中輸入價格範圍,10,70後,DataGrid1中顯示的查詢結果如下: 
   
  ID     商品名稱   商品價格    
  1        足球     57.5    
  2        籃球     64.5     
    
  可見,用DataView的RowFilter屬性完全能達到SQL語句SELECT語句所實現的功能     
  RowFilter中的查詢語句與SQL語句中SELECT語句的文法和作用都極為相似,以下是摘自MSDN中關於RowFilter查詢語句的文法說明:     
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
  使用者定義的值可以用在將與列值進行比較的運算式內。字串值應放在單引號內。日期值應放在磅符號 (#) 內。對於數值,允許使用小數和科學記號標記法。例如: 
    
  "FirstName = 'John'"  
   
  "Price <= 50.00"    
   
  "Birthdate < #1/31/82#"    
   
  對於包含枚舉值的列,將值強制轉換為整數資料類型。例如: 
   
  "EnumColumn = 5"    
   
  運算子    
   
  使用布爾值 AND、OR 和 NOT 運算子時允許串聯。可以使用括弧來組合子句和強制優先順序。AND 運算子優先於其他運算子。例如: 
   
  (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'    
   
  在建立比較運算式時,允許使用下列運算子: 
   
  < 
   
  >   
   
  <=    
   
  >=   
   
  <> 
    
  = 
     
  IN 
     
  LIKE 
      
  在運算式中還支援下列算術運算子: 
      
  +(加) 
     
  -(減) 
      
  *(乘) 
      
  /(除) 
      
  %(模數) 
      
  字串運算子 
      
  若要連接字串,請使用 + 字元。字串比較是否區分大小寫由 DataSet 類的 CaseSensitive 屬性的值來確定。但是,可以用 DataTable 類的 CaseSensitive 屬性重寫此值。 
     
  萬用字元 
      
  在 LIKE 比較中,* 和 % 兩者可以互換地作為萬用字元。如果 LIKE 子句中的字串包含 * 或 %,那麼這些字元應用中括弧([])對其進行轉義。如果子句中有中括弧,那麼中括弧字元應用中括弧對其進行轉義(例如 [[] 或 []])。在模式的開頭和結尾,或者在模式的結尾,或在模式的開頭允許使用萬用字元。例如: 
      
  "ItemName LIKE '*product*'" 
      
  "ItemName LIKE '*product'" 
      
  "ItemName LIKE 'product*'" 
      
  在字串的中間不允許使用萬用字元。例如,不允許 'te*xt'。 
     
  父/子關係引用 
      
  通過在列名稱前面加 Parent,就可以在運算式中引用父表。例如,Parent.Price 引用父表的名為 Price 的列。 
     
  通過在列名稱前面加一個 Child,就可以在運算式中引用子表中的列。但是,因為子關係可以返回多行,所以必須在彙總函式中包括對子列的引用。例如,Sum(Child.Price) 將返回子表中名為 Price 的列的總和。 
      
  如果某個表有多個子表,則文法是:Child(RelationName)。例如,如果某個表有兩個子表,它們的名稱分別為 Customers 和 Orders,則 DataRelation 對象被命名為 Customers2Orders,引用將為: 
      
  Avg(Child(Customers2Orders).Quantity) 
      
  彙總 
      
  支援下列彙總類型: 
      
  Sum(求和) 
      
  Avg(平均) 
      
  Min(最小值) 
      
  Max(最大值) 
      
  Count(計數) 
      
  StDev(統計標準差) 
      
  Var(統計方差)。 
     
  彙總通常沿著關係執行。通過使用上面列出的函數之一和上面“父/子關係引用”中詳述的子表列,來建立彙總運算式。例如: 
     
  Avg(Child.Price) 
      
  Avg(Child(Orders2Details).Price) 
      
  彙總也可以在單個表上執行。例如,若要為名為“Price”的列中的數字建立匯總,就用: 
      
  Sum(Price) 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.