DataView查询详解与语法

dataview查询详解与语法

dataview 的一个主要功能是允许在 windows 窗体和 web 窗体上进行数据绑定。

另外,可自定义 dataview 来表示 datatable 中数据的子集。 此功能让您拥有绑定到同一 datatable、但显示不同数据版本的两个控件。 例如,一个控件可能绑定到显示表中所有行的 dataview,而另一个控件可能配置为只显示已从 datatable 删除的行。 datatable 也具有 defaultview 属性。 它返回表的默认 dataview。 例如,如果希望在表上创建自定义视图,请在 defaultview 返回的 dataview 上设置 rowfilter。

若要创建数据的筛选和排序视图,请设置 rowfilter 和 sort 属性。 然后,使用 item 属性返回单个 datarowview。

还可使用 addnew 和 delete 方法从行的集合中进行添加和删除。 在使用这些方法时,可设置 rowstatefilter 属性以便指定只有已被删除的行或新行才可由 dataview 显示。

 

用户定义的值可以用在将与列值进行比较的表达式内。字符串值应放在单引号内。日期值应放在磅符号 (#) 内。对于数值,允许使用小数和科学记数法。例如:
   "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)

sum(price)

说明:
如果使用一个表来创建聚合,将没有组合功能。相反,所有行都在列中显示相同的值。
 

如果表没有行,聚合函数将返回 nullnothingnullptrnull 引用(在 visual basic 中为 nothing)。

数据类型总是可以通过检查列的 datatype 属性来确定。还可以使用 convert 函数来转换数据类型,如下面这一部分所示。

functions

还支持下列函数:

convert

说明
 将特定表达式转换为指定的 .net framework 类型。
 
语法
 convert(expression, type)
 
参数
 expression — 要转换的表达式。

type — 值将转换成的 .net framework 类型。
 

例如:mydatacolumn.expression="convert(total, 'system.int32')"

所有转换都是有效的,只有下列情况例外:boolean 只能与 byte、sbyte、int16、int32、int64、uint16、uint32、uint64、string 和它本身相互转换。char 只能与 int32、uint32、string 和它本身相互转换。datetime 只能与 string 和它本身相互转换。timespan 只能与 string 和它本身相互转换。

len

说明
 获取字符串的长度
 
语法
 len(expression)
 
参数
 expression — 要计算的字符串。
 

例如:mydatacolumn.expression="len(itemname)"

isnull

说明
 检查表达式并返回已检查的表达式或返回替换值。
 
语法
 isnull(expression, replacementvalue)
 
参数
 expression — 要检查的表达式。

replacementvalue — 如果表达式为 nullnothingnullptrnull 引用(在 visual basic 中为 nothing),则返回 replacementvalue。
 

例如:mydatacolumn.expression="isnull(price, -1)"

iif

说明
 根据逻辑表达式的结果,获取两个值之一。
 
语法
 iif(expr, truepart, falsepart)
 
参数
 expr — 要计算的表达式。

truepart — 表达式为真时返回的值。

falsepart — 表达式为假时返回的值。
 

例如:mydatacolumn.expression = "iif(total>1000, 'expensive', 'dear')

trim

说明
 移除所有前导的和后缀的空格字符,如 r、n、t、' '
 
语法
 trim(expression)
 
参数
 expression — 要剪裁的表达式。
 

substring

说明
 获取从字符串中的指定点开始,具有指定长度的子字符串。
 
语法
 substring(expression, start, length)
 
参数
 expression — 子字符串的源字符串。

start — 指定子字符串开始位置的整数。

length — 指定子字符串长度的整数。
 

例如:mydatacolumn.expression = "substring(phone, 7, 8)"

面的示例根据 linq to dataset 查询创建按应付款总额排序的在线订单的 dataview:

datatable orders = dataset.tables["salesorderheader"];

enumerablerowcollection<datarow> query =
    from order in orders.asenumerable()
    where order.field<bool>("onlineorderflag") == true
    orderby order.field<decimal>("totaldue")
    select order;

dataview view = query.asdataview();

bindingsource1.datasource = view;

下面的示例创建一个具有一个列和五个行的 datatable。 创建两个 dataview 对象,并针对每个对象设置 rowstatefilter 以显示表数据的不同视图。 然后打印这些值。

private void demonstratedataview()
{
    // create one datatable with one column.
    datatable table = new datatable("table");
    datacolumn colitem = new datacolumn("item",
        type.gettype("system.string"));
    table.columns.add(colitem);

    // add five items.
    datarow newrow;
    for(int i = 0; i <5; i++)
    {
        newrow = table.newrow();
        newrow["item"] = "item " + i;
        table.rows.add(newrow);
    }
    // change the values in the table.
    table.rows[0]["item"]="cat";
    table.rows[1]["item"] = "dog";
    table.acceptchanges();

    // create two dataview objects with the same table.
    dataview firstview = new dataview(table);
    dataview secondview = new dataview(table);

    // print current table values.
    printtableorview(table,"current values in table");

    // set first dataview to show only modified
    // versions of original rows.
    firstview.rowstatefilter=dataviewrowstate.modifiedoriginal;

    // print values.  
    printtableorview(firstview,"first dataview: modifiedoriginal");

    // add one new row to the second view.
    datarowview rowview;
    rowview=secondview.addnew();
    rowview["item"] = "fish";

    // set second dataview to show modified versions of
    // current rows, or new rows.
    secondview.rowstatefilter=dataviewrowstate.modifiedcurrent
        | dataviewrowstate.added;
    // print modified and added rows.
    printtableorview(secondview,
        "second dataview: modifiedcurrent | added");
}

private void printtableorview(datatable table, string label)
{
    // this function prints values in the table or dataview.
    console.writeline("n" + label);
    for(int i = 0; i<table.rows.count;i++)
    {
        console.writeline("table" + table.rows[i]["item"]);
    }
    console.writeline();
}

private void printtableorview(dataview view, string label)
{

    // this overload prints values in the table or dataview.
    console.writeline("n" + label);
    for(int i = 0; i<view.count;i++)
    {
        console.writeline("table" + view[i]["item"]);
    }
    console.writeline();
}

时间: 2024-09-13 17:16:28

DataView查询详解与语法的相关文章

mysql5.7.10开启慢查询详解_Mysql

如下所示: #在/etc/my.cnf中的[mysqld]中加入如下代码: slow-query-log=On slow_query_log_file=/data/mysql/log/mysql_slow_query.log long_query_time=2 log_queries_not_using_indexes = ON 第一句是开启慢查询 第二句是用来定义慢查询日志的路径 第三句是用来定义查过多少秒的查询算是慢查询,我这里定义的是2秒 第四句就是记录下没有使用索引的query 以上这篇

MySQL数据库WHERE查询in,like子查询详解

我们已经看到SQL SELECT命令来从MySQL表获取数据.我们可以使用一个条件子句WHERE子句中筛选出来的结果.使用WHERE子句,我们可以指定一个选择的标准来从表中选择所需的记录. 语法: 下面是通用的SQL WHERE子句来获取数据从MySQL表的SELECT命令的语法:  代码如下 复制代码 SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE condition1 [AND [OR]] conditio

ThinkPHP视图查询详解_php实例

ThinkPHP提供的视图查询应用功能十分强大,用户利用视图查询功能可以将多个数据表的字段内容按需要进行指定和筛选,组织成一个基于这些数据表的视图模型,然后就可以通过该模型直接进行多表联合查询,非常方便和简单. 例如在项目中,我们定义有三个表: user          用户基础表, user_info   用户详细信息表, dept          部门分类表 现在我们需要获取某个用户信息, 该信息要包括用户的帐号名称和相关资料与及所在部门的名称, 这时候我们可以利用视图查询进行处理. 下

oracle闪回版本和闪回事务查询详解

  --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间内的各个版本 --- 使用闪回事务查询查看事务处理历史记录或行 优点: 闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术.使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间.当闪回技术使用时,它与介质恢复相比,在易用性.可用性和还原时间方面有明显的优势. 闪回数据库使用闪回日

Mysql子查询和联合(UNION)查询详解

查询:  在select查询中,又嵌套了一个select查询.一个是外层查询,另一个是内层查询. Where子查询 就是在where查询语句有一个select语句,把内层查询的结果当做外层查询的条件. From子查询 在from 查询语句中,有一个select语句,把内层查询结果作为一张临时表,供外层再一次查询. 区别: 对于不是唯一取值的列,使用where子查可能会出现不正确的结果.如果用from,有分组的情况下,我们要通过排序把需要的记录放在第一的位置上. Exists #查询有商品的栏目

ajax分页查询详解

(1)先写个显示数据的页面,分页查询需要那几个部分呢? 1.首先是查询的文本框输入,还有查询按钮,那么就开始写代码吧 <div> <input type="text" id="key" /> //输入查询字的文本框 <input type="button" value="查询" id="chaxun" /> //查询按钮,起名字是为了以后给这个按钮加事件,因为只有点击了才

SQL Server中的连接查询详解_MsSql

在查询多个表时,我们经常会用"连接查询".连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 知道了连接查询的概念之后,什么时候用连接查询呢? 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class).  T_student                       

SQL Server中的连接查询详解

在查询多个表时,我们经常会用"连接查询".连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 知道了连接查询的概念之后,什么时候用连接查询呢? 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class). T_student T_class 连接标准语法格式: SQL-9

SQL多表查询详解

本教程为大家介绍SQL中的多表查询,下面我们来看看具体实例吧. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) 一.外连接 外连接可分为:左连接.右连接.完全外连接. 1.左连接 left join 或 left outer join SQL语句:select * from student left join course on student.ID