不用SQL語句查詢DataTable中的資料

來源:互聯網
上載者:User
資料|語句 在實際編程工程中,常常遇到這樣的情況: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)





相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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