|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一般的指的.net就是跟java相对的那种,主要是做企业级应用的。你如果想学这个,主要就是学C#和数据库。(ASP.NET好像很重要的,应该也要学的,ASP.NET上好像可以结合VB和C#等多种语言,但是微软主推C#)ado|数据|数据库 利用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。
在盘算中表达式能够包含从数据表中别的字段失掉的字面值。比方,界说扩大代价的表达式能够稍作改动,使它思索扣头率:
oDs.Tables["OrderDetail"].Columns.Add("ExtendedPrice",
typeof(decimal),"(UnitPrice*Quantity)*(1-Discount)");
试着改动UnitPrice、Discount或Quantity数据列的值,了局是与从SQL表达式衍生的列分歧,ExtendedPrice数据列也被更新了。该特性对使用程序很主要,出格是在用户能修正购物车,确认改动,然后检察更新后的总代价的情形下。
表达式也能够用于体现别的数据范例,比方逻辑型和字符型值。上面的代码演示了增加一个字段用于显现一个作者是不是有扣头:
oDs.Tables["OrderDetail"].Columns.Add("GetsDiscount",typeof(bool),
"Discount>0");
你能利用AND、OR或NOT前提创建夹杂表达式来思索多个前提,如许能够增强后面的表达式。另有一些操纵符,包含LIKE和IN也能够在表达式中利用。
表达式也能体现字符串值,比方从数据表中获得姓和名并毗连到一同。上面的代码段将ProductName与ProductID毗连在一同:
oDs.Tables["OrderDetail"].Columns.Add("stringfield",typeof(string),
"ProductID+-+ProductName");
函数
假如你但愿列包括有更庞大逻辑的表达式,能够在列中嵌进一些函数。表达式能包括Len、Iif、IsNull、Convert、Trim和Substring等函数。这些函数为创建表达式供应了更年夜的天真性。Len函数盘算字符串的长度:
oDs.Tables["OrderDetail"].Columns.Add("LengthOfProductName",
typeof(int),"Len(ProductName)");
Iif函数是一个迭代的If语句,象VisualBasic.NET中的IIf一样。它有三个参数并盘算第一个参数的真假。假如第一个参数盘算值为真,将从Iif函数前往第二个参数,不然前往第三个参数。上面基础上是一个稀释的If...Then...Else语句,能复杂地写成嵌进表达式:
oDs.Tables["OrderDetail"].Columns.Add("Inventory",typeof(string),
"Iif(Quantity<10,Afewleft,Plentyinstock)");
IsNull函数盘算第一个参数,看它是不是与System.DbNull相称。假如盘算了局为假,函数前往第一个参数值,假如为真则前往第二个参数值。这在不同意空值,而且但愿用空字符串或占位符取代时利用:
oDs.Tables["OrderDetail"].Columns.Add("DiscountString",
typeof(string),"IsNull(Discount,[nullvalue])");
Trim函数删除字符串值尾部的空格。Convert函数将表达式中的数据范例转换为函数第二个参数所指的数据范例。Substring函数前往字符串的一部分,可用于将长字符串剪短,只显现定长的字符串,它能够前往字符串的恣意部分并依据必要与别的的函数组合利用:
oDs.Tables["OrderDetail"].Columns.Add("ShortProduct",
typeof(string),"Substring(ProductName,1,10)");
汇合和干系
表达式中的嵌进汇合函数能匡助你创建一个体现更庞大逻辑的表达式。假如要创建一个列盘算跨多个行的值怎样办?最好到场汇合函数。
假定在一个数据会合有相似SQLServer的Northwind数据库中的定单到定单细节的干系布局,那末用包括汇合函数的表达式创建列就很间接。上面的代码演示了如何创建一个包括布局的数据集,在该数据会合定单位于父数据表而定单细节位于子数据表。这些数据表工具经由过程一个叫Orders2OrderDetails的数据干系相互联系关系。
请注重代码是如何创建表达式列并增加到Order数据表的。第一个表达式创建一个体现每一个定单的具体信息汇总的列。出格的是OrderTotal数据列有一个表达式用于汇总OrderDetail数据表的基于表达式的ExtendedPrice数据列。你能发明,能够超过数据干系利用汇合函数并将它用在另外一个基于表达式的列上。
ADO.NET中另有别的的汇合函数,包含Sum、Avg、Max、Min、StDev、Var和Count。上面的代码演示了如何利用Avg函数失掉定单具体数目的均匀值。关头在于利用父(parent)和子(child)关头字经由过程数据干系毗连数据:
oDs.Tables["Order"].Columns.Add("AvgQuantity",typeof(decimal),
Avg(Child(Order2OrderDetail).Quantity)");
Child函数承受数据干系名来猎取子行汇合。该参数是可选的,只要在源数据表中的子干系多于一个时才必要。因而,假如数据表只要一个子表,语法能够简化:
oDs.Tables["Order"].Columns.Add("AvgQuantity",typeof(decimal),
Avg(Child.Quantity)");
向下转动和盘算
Parent函数与Child函数事情相似,只是它沿干系链下行抵达父数据表。在ADO.NET代码中这两个函数匡助创建一个假的GROUPBY函数性。
这些关头字的另外一个操纵是上滚或下滚从一个数据表到另外一个数据表稳定的值。常常有人问我如何将一个父数据表和子数据表毗连成一个数据表,如许才干在一个DataGrid控件中显现。利用父关头字能够将字段下滚到子数据表,接着只将该子数据表绑定到DataGrid控件。比方,必要显现OrderDetail数据表中每行的定单日期,能够增加一个利用父关头字的数据列:
oDs.Tables["OrderDetail"].Columns.Add("OrderDate",typeof(string),
"Parent.OrderDate");
这个特性使得不必要作任何盘算就能够上滚和下滚字段。利用Child关头字能够从父表中下滚字段并绑定到DataGrid控件。实行该操纵后你失掉了一个两位小数的行汇合,与从SQL语句中失掉的一样。要记着,假如盘算利用单个行汇合中的数据,最好前往单个行汇合到数据表。可是,假如你想在数据会合利用干系布局,Parent关头字给了你显现数据的天真性。
另外一个值得一看的特性是数据表的Compute函数,该函数利用给定了过虑前提确当前数据表上的汇合函数来盘算。比方,能给数据表加一列用于盘算定单总价年夜于999的定单总数目。
鄙人例所示的Compute函数的第一个参数中,实行了一个汇合函数盘算切合前提的一切OrderTotal值:
//显现定单代价年夜于999的定单数目
intiCnt=(int)oDs.Tables["Order"].Compute("Count(OrderTotal)",
"OrderTotal>=1000");
lblTest.Text=iCnt.ToString()+"ordersareatleast$1000";
在第二个参数中指定了过滤器,将汇合函数限制为只包括切合前提的行。代码盘算OrderTotal年夜于或即是1000的行。这是一个在数据表中疾速实行盘算的壮大工具,特别是能利用过虑。比方,你能很简单地查找出订X货品的主顾数目和订Y货品的主顾数目,而不必要轮回查询数据库。
注重绑定到表达式的数据列工具不克不及手动更新。绑定到表达式的列不会被掩盖,除非表达式被删除。固然,这些数据也不会与数据库或XML文件中作为数据源的列绝对应。因而,假如你想将数据保留到数据库中时,要记得表达式不克不及保留进数据库。
上文会商了SQL和ADO.NET中的表达式,演示了表达式所供应的普遍的函数功效,你能在使用程序中利用它们天生和增加数据。
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。 |
|