不用SQL語(yǔ)句查詢DataTable中的數(shù)據(jù)
2024-07-21 02:23:13
供稿:網(wǎng)友
在實(shí)際編程工程中,常常遇到這樣的情況:datatable并不是數(shù)據(jù)庫(kù)中的,或者datatable尚未寫到數(shù)據(jù)庫(kù),或者從數(shù)據(jù)庫(kù)中讀出的datatable已經(jīng)在本地被改動(dòng),又沒(méi)有寫回?cái)?shù)據(jù)庫(kù)(可能還要作其他改動(dòng)),在這些情況下,要查詢datatable中的數(shù)據(jù),強(qiáng)大的sql語(yǔ)言就派不上用場(chǎng)了。
有些.net程序員采取在數(shù)據(jù)庫(kù)中建立臨時(shí)表等方法來(lái)解決這類查詢問(wèn)題。而我覺(jué)得這種方法不可行,其實(shí)只要用.net類庫(kù)中提供的dataview類的強(qiáng)大功能(主要是用它的rowfilter屬性),就能方便地解決這類查詢問(wèn)題。下面就舉一個(gè)具體的例子,來(lái)說(shuō)明如何不用sql語(yǔ)句,用dataview的rowfilter屬性來(lái)查詢。
步驟一:建立一個(gè)c#的asp.net項(xiàng)目。先編寫一個(gè)生成datatable的函數(shù)makedatatable(),代碼如下:
private datatable maketable()
{
//生成datatable
system.data.datatable mydatatable = new datatable("本地?cái)?shù)據(jù)表");
datacolumn mydatacolumn;
datarow mydatarow;
//生成數(shù)據(jù)列 id,商品名稱,商品價(jià)格
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 = "商品價(jià)格";
mydatatable.columns.add(mydatacolumn);
//為數(shù)據(jù)表添加數(shù)據(jù)行
mydatarow = mydatatable.newrow();
mydatarow["id"] = 1;
mydatarow["商品名稱"] = "足球";
mydatarow["商品價(jià)格"] =57.5;
mydatatable.rows.add(mydatarow);
mydatarow = mydatatable.newrow();
mydatarow["id"] = 2;
mydatarow["商品名稱"] = "籃球";
mydatarow["商品價(jià)格"] =64.5;
mydatatable.rows.add(mydatarow);
mydatarow = mydatatable.newrow();
mydatarow["id"] = 3;
mydatarow["商品名稱"] = "網(wǎng)球";
mydatarow["商品價(jià)格"] =6.5;
mydatatable.rows.add(mydatarow);
mydatarow = mydatatable.newrow();
mydatarow["id"] = 4;
mydatarow["商品名稱"] = "網(wǎng)球拍";
mydatarow["商品價(jià)格"] =388.5;
mydatatable.rows.add(mydatarow);
//返回?cái)?shù)據(jù)表
return mydatatable;
}
步驟二:在aspx前臺(tái)頁(yè)面中添加一個(gè)datagrid1,在后臺(tái)代碼的page_load中編寫如下代碼:
if(!this.ispostback)
{
session["table"]=maketable();
datagrid1.datasource=(datatable)session["table"];
datagrid1.databind();
}
此時(shí)瀏覽頁(yè)面,可以看到datagrid中顯示的表中數(shù)據(jù)。
id
商品名稱
商品價(jià)格
1
足球
57.5
2
籃球
64.5
3
網(wǎng)球
6.5
4
網(wǎng)球拍
388.5
步驟三:在aspx前臺(tái)頁(yè)面添加一個(gè)用來(lái)查詢label1,textbox1和button1。如下圖所示:
步驟四:在查詢按鈕button1單擊事件中添加如下代碼:
datatable dt=(datatable)session["table"];
//為數(shù)據(jù)表建立一個(gè)數(shù)據(jù)視圖
dataview dv=new dataview(dt);
//用rowfilter屬性進(jìn)行模糊查詢
dv.rowfilter="商品名稱 like'%"+textbox1.text.trim()+"%'";
datagrid1.datasource=dv;
datagrid1.databind();
運(yùn)行頁(yè)面后在textbox1中輸入“網(wǎng)”,按查詢按鈕后 ,datagrid顯示的查詢結(jié)果如下:
id
商品名稱
商品價(jià)格
3
網(wǎng)球
6.5
4
網(wǎng)球拍
388.5
步驟五:在aspx前臺(tái)頁(yè)面上添加一個(gè)label2控件,兩個(gè)textbox控件-textbox1和textbox2,以及一個(gè)“查詢”按鈕,button2,如下圖所示,用來(lái)查詢用戶輸入的價(jià)格范圍中在商品。
步驟六:在后臺(tái)代碼中為button2按鈕單擊事件添加如下如下代碼:
datatable dt=(datatable)session["table"];
dataview dv=new dataview(dt);
dv.rowfilter="商品價(jià)格>="+textbox2.text.trim()+" and 商品價(jià)格<="+textbox3.text.trim();
datagrid1.datasource=dv;
datagrid1.databind();
用戶在兩個(gè)文本框中輸入價(jià)格范圍,10,70后,datagrid1中顯示的查詢結(jié)果如下:
id
商品名稱
商品價(jià)格
1
足球
57.5
2
籃球
64.5
可見,用dataview的rowfilter屬性完全能達(dá)到sql語(yǔ)句select語(yǔ)句所實(shí)現(xiàn)的功能
rowfilter中的查詢語(yǔ)句與sql語(yǔ)句中select語(yǔ)句的語(yǔ)法和作用都極為相似,以下是摘自msdn中關(guān)于rowfilter查詢語(yǔ)句的語(yǔ)法說(shuō)明:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
用戶定義的值可以用在將與列值進(jìn)行比較的表達(dá)式內(nèi)。字符串值應(yīng)放在單引號(hào)內(nèi)。日期值應(yīng)放在磅符號(hào) (#) 內(nèi)。對(duì)于數(shù)值,允許使用小數(shù)和科學(xué)記數(shù)法。例如:
"firstname = 'john'"
"price <= 50.00"
"birthdate < #1/31/82#"
對(duì)于包含枚舉值的列,將值強(qiáng)制轉(zhuǎn)換為整數(shù)數(shù)據(jù)類型。例如:
"enumcolumn = 5"
運(yùn)算符
使用布爾值 and、or 和 not 運(yùn)算符時(shí)允許串聯(lián)。可以使用括號(hào)來(lái)組合子句和強(qiáng)制優(yōu)先級(jí)。and 運(yùn)算符優(yōu)先于其他運(yùn)算符。例如:
(lastname = 'smith' or lastname = 'jones') and firstname = 'john'
在創(chuàng)建比較表達(dá)式時(shí),允許使用下列運(yùn)算符:
<
>
<=
>=
<>
=
in
like
在表達(dá)式中還支持下列算術(shù)運(yùn)算符:
+(加)
-(減)
*(乘)
/(除)
%(模數(shù))
字符串運(yùn)算符
若要連接字符串,請(qǐng)使用 + 字符。字符串比較是否區(qū)分大小寫由 dataset 類的 casesensitive 屬性的值來(lái)確定。但是,可以用 datatable 類的 casesensitive 屬性重寫此值。
通配符
在 like 比較中,* 和 % 兩者可以互換地作為通配符。如果 like 子句中的字符串包含 * 或 %,那么這些字符應(yīng)用中括號(hào)([])對(duì)其進(jìn)行轉(zhuǎn)義。如果子句中有中括號(hào),那么中括號(hào)字符應(yīng)用中括號(hào)對(duì)其進(jìn)行轉(zhuǎn)義(例如 [[] 或 []])。在模式的開頭和結(jié)尾,或者在模式的結(jié)尾,或在模式的開頭允許使用通配符。例如:
"itemname like '*product*'"
"itemname like '*product'"
"itemname like 'product*'"
在字符串的中間不允許使用通配符。例如,不允許 'te*xt'。
父/子關(guān)系引用
通過(guò)在列名稱前面加 parent,就可以在表達(dá)式中引用父表。例如,parent.price 引用父表的名為 price 的列。
通過(guò)在列名稱前面加一個(gè) child,就可以在表達(dá)式中引用子表中的列。但是,因?yàn)樽雨P(guān)系可以返回多行,所以必須在聚合函數(shù)中包括對(duì)子列的引用。例如,sum(child.price) 將返回子表中名為 price 的列的總和。
如果某個(gè)表有多個(gè)子表,則語(yǔ)法是:child(relationname)。例如,如果某個(gè)表有兩個(gè)子表,它們的名稱分別為 customers 和 orders,則 datarelation 對(duì)象被命名為 customers2orders,引用將為:
avg(child(customers2orders).quantity)
聚合
支持下列聚合類型:
sum(求和)
avg(平均)
min(最小值)
max(最大值)
count(計(jì)數(shù))
stdev(統(tǒng)計(jì)標(biāo)準(zhǔn)偏差)
var(統(tǒng)計(jì)方差)。
聚合通常沿著關(guān)系執(zhí)行。通過(guò)使用上面列出的函數(shù)之一和上面“父/子關(guān)系引用”中詳述的子表列,來(lái)創(chuàng)建聚合表達(dá)式。例如:
avg(child.price)
avg(child(orders2details).price)
聚合也可以在單個(gè)表上執(zhí)行。例如,若要為名為“price”的列中的數(shù)字創(chuàng)建匯總,就用:
sum(price)