程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 不用SQL語句查詢DataTable中的數據

不用SQL語句查詢DataTable中的數據

編輯:.NET實例教程

     在實際編程工程中,常常遇到這樣的情況: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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved