帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
不用SQL语句查询DataTable中的数据
作者:fanz2000 发布时间:2005-03-12 来源:ASPCOOL
     在实际编程工程中,常常遇到这样的情况: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)
  
  
  
  作者Blog:http://blog.csdn.net/fanz2000/

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统