在实际编程工程中,常常遇到这样的情况: 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 。如下图所示:
.files\image002.jpg)
步骤四:在查询按钮 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 ,如下图所示,用来查询用户输入的价格范围中在商品。
.files\image004.jpg)
步骤六:在后台代码中为 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<