zoukankan      html  css  js  c++  java
  • 在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。

    步骤四:在查询按钮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)

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/flyhigh1860/p/3021853.html
Copyright © 2011-2022 走看看