不用SQL语句查询DataTable中的数据【原创】

在实际编程工程中,常常遇到这样的情况: 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 。如下图所示:
![](http://dev.csdn.net/article/50/C:/Documents and Settings\Administrator\桌面\新建 Microsoft Word 文档 (2).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 ,如下图所示,用来查询用户输入的价格范围中在商品。
![](http://dev.csdn.net/article/50/C:/Documents and Settings\Administrator\桌面\新建 Microsoft Word 文档 (2).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<

Published At
Categories with Web编程
Tagged with
comments powered by Disqus