共有回帖数 1 个
-
使用ADO.NET管理数据库中的关系(relation)非常简单。作为返回单个行集合(rowset)到数据存储(datastore)的代替,你可以返回多个行集合并在数据集(DataSet)中将它们关联起来。在ADO.net中使用关联的数据表(DataTable)有很多好处,包括有将数据存储为层次结构的能力、更容易更新数据、有在列中使用表达式的能力等等。
本文介绍ADO.NET中基于列(column-based)的表达式和计算。我将演示数据列(DataColumn)上集合函数的使用、汇总、在整个数据集中执行其它类型的计算以及在数据表之间连接数据列。文中还举了几个实例。
在SQL查询中合计(summing)和平均值(averaging)对你来说很老套了,这要感谢ANSISQL中有类似SUM和AVG的集合函数。SQL允许列的计算,例如按次序把产品单价乘以数量产生扩充价格。现在ADO.NET提供了一条途径扩展这些数据源之外的特征并进入n层结构应用程序中间或上层。在ADO.NET中使用列表达式,你能用数据集中的计算值建立自己的列,在同一行中计算其它列的值,甚至通过数据关系(DataRelation)从父数据表或子数据表获取值。使用ADO.NET中的基于列的表达式和计算形成了新的管理数据的技术。
当然,在ADO.NET中使用基于表达式的列、集合和计算有利也有弊。表达式可用于数据集的单个数据表或者通过数据关系交叉的两个数据表对象。本文将解释在ADO.NET和SQL中基于表达式的列有什么不同,以及你能从它们中得到什么东西。本文讨论了许多操作,包括用表达式上滚(rollup)和下滚(rolldown),它依赖于DataRelation对象的关系。我将演示怎样在数据列对象中建立表达式,怎样使用数据集和SQL建立集合函数,怎样在数据集中上滚和下滚字段,怎样在数据集中执行列的计算。
SQL中的表达式
SQL表达式为达到不同的目的有多种格式,包括字符串格式、用户定义函数和数学计算。如果SQL语句将姓和名连接到一起、按订单条目次序计算扩充价格、或者在SQLServer2000中包含一个用户定义函数来检索一个订单日期,SQL语句就包含了表达式。
表达式为程序开发人员从数据库中的其它字段衍生出的行集合中的返回值提供了很大的灵活性。关系型和标准的数据库不会保存订单条目的扩充价格,它只存储单价和数量。扩充价格能从这些值中计算出来,这样避免了数据不同步。例如,如果在一行中存储了数量、单价和扩充价格,可能出现数量为100,单价为7,扩充价格为100的情况。这种情况不该发生,但是如果存储了冗余数据就可能发生了。事务性数据库的通用准则是不存储可以衍生出的信息,例如扩充价格。
这样就有了SQL表达式表演的舞台了。扩充价格能通过在SQL语句中建立计算列,将单价乘以数量衍生出。扩充价格又能计算帐户的折扣率等信息。下面的SQL代码演示了怎样在SQL表达式中连接字符串。例子将姓与名连接在一起并返回大写的全名,名字位于前面:
USEpubs
GO
SELECTau_fnameASFirstName,
au_lnameASLastName,
au_lname ',' au_fnameASFullName1,
(UPPER(au_fname) '' UPPER(au_lname))ASFullName2
FROMauthors
ORDERBY
au_lname,
au_fname
SQL表达式能够在行集合中格式化字符串并执行计算,但是为了达到这个目的,你要注意一些问题:如果用上面的SQL语句填充数据集,并且首行的数量列被修改了,表达式列不会跟着改变。例如,如果数量为10,价格为7,现在数量变为5,ExtendedPrice列的值仍为70(10×7),数据没有同步。出现这种情况的主要原因是表达式没有从SQL语句传递到ADO.NET数据集。
数据列表达式
表达式也可以通过ADO.NET数据列对象定义。作为通过SQL语句计算扩充价格的替代者,数据列可以被定义用于表现扩充价格。在SQL语句和数据列中使用表达式的区别是,如果表达式中的某个字段被修改了,数据列会自动更新表达式所定义的字段,但SQL表达式不会更新数据列。下面的代码演示了怎样使用SQL语句填充数据集的数据表并建立一个新数据列描述计算表达式,该表达式使用数据集的唯一数据表中的其它字段得到。接着该数据表的默认视图被绑定到ASP.net的一个叫做grdOrderDetail的DataGrid控件。
这段代码使用订单详细信息建立和填充了一个数据集。接着一个列被添加到该数据集的数据表,用于表现该表达式。该列叫ExtendedPrice,数据类型为浮点型,它的表达式是产品单价和数量列。该表达式能涉及数据表的任意数据列,从当前的数据行中取得值。例如,如果第一行数量为10,单价为7,扩充价格列将使用的值为70。
楼主 2016-08-31 19:17 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知