大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> 掌握ADO.NET的十个热门技巧

掌握ADO.NET的十个热门技巧

时间: 2021-07-31 作者:daque

ado.net供给了一个一致的编制程序形式和一组公用的类来举行任何典型的数据考察,而尽管你用何种谈话来开拓代码。ado.net是崭新的,但又与ado尽大概维持普遍,它使编制程序形式从一个存户端/效劳器、鉴于贯穿的形式变化到了一个新的形式,这个新形式不妨让割断的前者载入记载、离线处事、而后从新贯穿来提交变革。ado.net是winforms运用步调、asp.net运用步调和web services的一个公有的特性。其功效不妨跨lan和internet贯穿来实行,不妨在有状况(stateful)和无状况(stateless)情景下实行。这就表示着,动作一个公有的本领,ado.net的东西在一切大概的情况中并不是一致宏大的。用ado.net为一个富存户端(rich client)建立一个数据层同为一个存户端常常是共享的和要害的实业(如web效劳器)的web运用步调建立一个数据层并不一律。即使你往日是个ado开拓职员,此刻仍旧用ado.net了,那么你大概把数据考察看做是一个全能的东西,如recordset。咱们很天然地会将旧的东西形式同新的东西形式配合起来,并将现有的本领用来.net运用步调。但是,在ado情况中的某些好的本领在变换到ado.net情况时就大概并不宏大了。并且,看上去很微乎其微的ado.net东西形式的搀杂性大概会引导很蹩脚的编制程序情景、不理念的代码、以至是功效不许实行。我将报告在ado.net编制程序中大概会给你带来烦恼的10个上面,并供给本领妥协决本领来制止它们。1. 制止database-agnostic情势的编制程序ado.net中的数据考察是强典型的,即是说在任何功夫你都必需领会你正在处置的是什么数据源(data source)。差异,在ado中,你不妨编写数据考察代码(它们充溢运用了ole db供给者的通用形式),并将基础的数据源只看做是个参数。ado东西形式供给了独一的贯穿和吩咐东西,它们湮没了基础的dbms的特性。一旦你在connection东西上树立了provider属性,那么为sql server或oracle创造一个吩咐东西就须要同样的代码。很多开拓职员都经过该功效来运用消费情况外的access数据库,再不很快地尝试或演练运用步调。在ado.net中是不许这么做的,由于在ado.net中,起码贯穿东西必需是一定于数据源的。你不许以一种转弯抹角或通用的办法来创造贯穿,只有你确定应用ado的数据考察本领——ole db。在ado.net中,你不妨用oledbconnection类创造到一个数据库的贯穿,这个类不妨让你考察百般数据源。在.net托管情况中应用system.data.oledb名字空间中的类并不更加灵验,由于它们是用ole db来考察数据的。你只能用ole db来考察那些没有.net数据供给者的数据源。即使你的运用步调必需考察全异的数据源(并且你领会大概波及什么数据源——一个有理的假如),那么你不妨创造一个会合的factory类,它归来一个贯穿东西,并经过一个通用的接口(idbconnection接口)来处置这个贯穿东西。factory类在里面应用运用步调参数来确定运用什么.net数据供给者:' create the connectiondim factory as new myappconnectionfactorydim conn as idbconnectionconn = factory.createconnection(connstring)' create the commanddim cmd as idbcommand = conn.createcommand(query)一旦你获得了一个贯穿东西,你就不妨以database-agnostic的办法来创造和实行一个吩咐了,而尽管运用的数据源是什么。你不妨运用createcommand本领并经过idbcommand接口来援用吩咐。而后,你不妨用idbcommand接口上的executereader本领或executenonquery本领来实行吩咐。即使你用executereader,你就不妨获得一个data reader并不妨用idatareader接口来对它举行普遍的考察了。你不许用一个通用的数据库编制程序形式来弥补一个dataset东西。本质上,你不许像创造一个吩咐那么以一种转弯抹角的办法来创造data adapter东西。因为即是,在有些情景下,data adapter各别于吩咐东西,它不妨在里面隐含地创造一个贯穿。但是,它必需以一种强典型的办法处事,并且必应知道基础的数据库效劳器是什么。2. 应用字符串来串行化扩充的属性几个ado.net东西都具有一个叫作extendedproperties的汇合。该属性就像搜集货色(cargo collection)一律,不妨用来保存任何典型的用户消息。dataset、datatable和datacolumn即是不妨供给该数据分子的类。ado.net经过应用propertycollection类封装的一个哈希表来实行这个extendedproperties属性。你不妨用add本领将数据插入到汇合中。add本领运用了两个参数来生存数据——key和value。该本领的究竟将参数设置为通用的东西典型,你不妨保存任何典型的消息。但是,在特出情景下,你该当更加提防那些被生存为扩充属性的东西的典型。即使你想将包括扩充属性的ado.net东西串行化到xml,最佳只用字符串。即使不行,你必需对ado.net的内涵的serializer的动作采用对策。当ado.net将一个dataset东西生存到xml时,extendedproperties汇合的实质就被串行化到外存中了,但大约是出于本能的因为,ado.net应用了tostring本领,而不是xml serializer来实行串行化。更要害的是,当ado.net东西被读回并恢复时,extendedproperties汇合包括的是东西的字符串展现情势,而不是东西自己。3. 应用具备blob字段的executexmlreader用来sql server的.net数据供给者(data provider)运用了数据库供给的xml扩充名,并供给了一个特殊的本领(executexmlreader)来实行查问。吩咐东西上的一切的实行者(比方executereader和executescaler)都沿用各别的本领来获得截止集。excecutereader经过一个托管南针(managed cursor)(data reader)来归来数据,而executescaler归来截止会合的第一个值,把它动作一个标量值。executexmlreader实行查问,并归来仍旧绑定到一个xmltextreader东西的鉴于xml的输入流。经过这种办法,你就不须要做特殊的处事来以xml的办法加工数据了。要实行这一点,查问字符串必需归来xml数据。对sql server来说,当查问字符串包括一个for xml子句时,就不妨实行它。纵然这不过一种大概。一个不太为人所知的情景是,要使executexmlreader处事,让截止集包括xml数据就充满了。 底下的查问本领很好,只有列包括xml方法的文本就行:select data from table where key=1这个列是个典范的blob或ntext字段,其文本表露为xml。简本地看看executexmlreader本领的里面构造会无助于于咱们的领会。该本领用executereader来实行查问,并从数据供给者获得一个数据流东西。接下来,它将数据流绑定到xmltextreader类的一个新创造的范例上,这个范例被归来给挪用者。贯穿从来居于劳累状况,直到xml reader遏止处事。sql server供给者是独一的供给者,它供给了本领让咱们从一个xml reader径直读取数据,但这种做法更多的是与供给者相关,而与数据库本能的联系并不大。oracle扶助xml查问,但oracle的数据供给者并不扶助xml查问。比拟之下,为ole db数据供给者编写一个executexmlreader本领并不难(点此载入范例)。4. 不要想法缓存一个dataviewdataset和datatable东西是独一的包括数据的ado.net东西。dataview是一个不许串行化的、轻量级的类,它只代办建立在一个表上的视图(view)。你不妨按照一个表白式或行的状况来过滤视图。很多运用步调都须要你处置数据视图并将它们绑定到数据控件上,如windows和web datagrid控件。一个dataview东西不许缓存数据;它不过缓存了与暂时过滤器相配合的基础的表中的行的索引。缓存索引的程序与暂时的排序表白式普遍。缓存dataview而不缓存基础的datatable是不行的。比方,供给分页(比方经过应用datagrid控件)的asp.net运用步调常常以一个dataview东西结果,由于它扶助排序和过滤。在有些情景下(大多是鉴于本能的因为),你大概确定要缓存数据源。要缓存的东西不许是dataview(它是你本质绑定的东西)。一个dataview不过一种索引,即使没有基础的datatable东西,它是没有效的。5. 应用find来读取一个记载经过应用datatable的select本领来运转一个外存中的查问,或在视图上树立一个过滤器来滤掉与指定规范不配合的一切的记载,你就不妨读取一个datatable东西中的一个一定的行了。你不妨经过树立dataview类上的rowfilter属性来树立一个过滤器。这两种本领都应用沟通的引擎来采用记载。它们不妨接收一个表白式,对它举行领会并求各个子句的值。datatable的select本领归来一个带有一切相配合的datarow东西的数组。rowfilter属性重修dataview的里面索引入包括一切的(且仅包括)配合的记载。而后,运用步调就不妨考察记载了。这两种本领在本能上简直是一律的;应用哪种本领在于于情况和部分爱好。比方,即使你用的是数据绑定的控件,如一个datagrid或datalist,那么rowfilter就很理念。即使你必需处置一串记载,那么select本领就更好了。但是,你还不妨用另一种本领(仍旧是鉴于dataview的),它是读取一个表中的记载的最快的本领。该本领即是用find:dim view as dataview view = new dataview(table)view.sort = "orderid"dim index as integer = view.find(10248)dim row as datarow = view(index).rowfind本领应用了视图的暂时索引,并将指定的值(或多个值)与产生暂时索引的字段配合起来。在前方的代码中,值10248与列orderid配合。即使sort属性为空,且datatable东西有一个主键,那么就应用主键中的列。find本领归来的是相配合的第一条龙的鉴于0的场所的值。即使你想归来多个记载,不妨用findrows的演化情势: view.sort = "orderid, discount"dim keys(1) as objectkeys(0) = 10248keys(1) = 0dim row as datarow = _ view(view.find(keys)).row前方的代码不妨让你经过应用find的重载本领(带有一组东西)来配合多个列的值。6. 尽大概用预先排序的数据ado.net东西形式使咱们不妨很简单地实行排序。你不妨创造一个dataview东西并树立其sort属性;ado.net runtime察看新的排序表白式并为视图重编索引。该办法是在外存中实行的,但速率并烦恼。排序的耗费很高,更要害的是,它并不是个线性操纵(linear operation)。对一组数据举行排序须要n*log(n)的计划本钱,即是说,跟着须要排序的条件数目的减少,曲线减少的本钱是很大的。所以,你该当控制运用步调中的排序,尽大概地应用预先排序的数据。在web运用步调中,动静排序对本能的感化是十分大的。既是如许,你就该当安排运用步调,控制对动静排序的需要,并依附在数据库效劳器中写死的算法。只有你在用运用步调的一个不妨使搀杂性低于n*log(n)极限的特出的功效,要不制止应用细工排序算法,由于这种算法大概比体例中的算法更糟。7. adox不妨帮你获得并变换schema消息ado.net并没成器获得并处置schema消息供给一个实足的东西形式。你该当用activex data objects extensions for data definition language and security (adox)或用每个数据库供给的当地功效来获得并变换schema消息。adox是ado东西的一个扩充,它囊括用来创造和窜改schema的东西。你不妨编写实用于百般数据源的代码(尽管当地语法有什么各别),由于adox是处置schema的一个鉴于东西的本领。你不妨用一个data reader东西来读(不是树立)大略的schema消息。一切的data reader类(oledbdatareader、sqldatareader、oracledatareader)都供给了一个getschematable本领,该本领不妨读取查问到的列的元数据消息。getschematable归来一个datatable东西(方法是每列一条龙)和恒定的一组包括消息的列。归来的元数据不妨分红二类:列元数据、数据库特性和列属性。归来的列不妨是allowdbnull、isautoincrement、columnname、isexpression、isreadonly和numericprecision等。在msdn材料中有完备的列表(见附加资源)。在挪用executereader时,即使你实行keyinfo吩咐,那么getschematable本领就不妨归来更透彻的数据。你不妨将keyinfo动作同缺省的动作贯串起来,实行一个独立的吩咐并获得schema和数据:reader = cmd.executereader( _ commandbehavior.keyinfo or _ commandbehavior.closeconnection)惟有实行keyinfo,iskey、basetablename、isaliased、isexpression和ishidden字段的值本领被精确归来。即使实行keyinfo,要害的列(即使有)常常是增添在截止集的底部的,但不给它们归来数据。8. 用一个派生的类和自设置的串行化来俭朴空间惟有两个ado.net东西是被标志为可串行化的——datatable和dataset。.net framework中的串行化是经过formatter东西来实行的,它们不妨将一个东西范例生存到一个二进制或一个soap流(stream)中。.net formatter用reflection来索取任何需要的消息。但是,即使这个类实行了iserializable接口,那么.net formatter就会给接口的本领凋零,让它们控制正片须要串行化到一个外存缓冲器中的一切的消息。datatable和dataset类都经过iserializable接口扶助串行化。即使你将一个datatable或一个dataset串行到一个二进制(binary stream)中,你该当不妨获得特殊紧凑的输入截止。固然你获得的截止文献是最小的,但可惜的是,它本质上并不小。差错的是,你生存到一个二进制的dataset比你用writexml本领生存到xml的同样的dataset要大很多。要证明这种情景,咱们须要来看看ado.net东西是用什么办法被串行起来的。在串行一个dataset东西时,它将鉴于xml的diffgram表白法生存在formatter的缓冲器中。在串行一个datatable时,它开始创造了一个偶尔的dataset东西,将它设置为它的parent,而后动作一个diffgram串行起来。一个diffgram是一个xml流,它供给了一个dataset中表和行的有状况的表白法。一个diffgram文献是很精细的,有些繁杂。diffgram包括暂时的数据,以及被窜改的行和未处置的缺点的初始值。当咱们生存一个dataset或一个datatable时,一切那些消息就会被传播给serializer。被串行化的东西老是包括xml数据,所以纵然当输入流是二进制的时,结果的输入截止仍旧会很大。你不妨创造一个接受datatable或dataset的新的可串行化的类来处置这个题目,而且更灵验地生存ado.net东西。你必需用<serizlizable()>属性来标志新类,纵然父类是不妨串行化的。本质上,串行性(serizlizability)并不是一个不妨机动接受的类属性。你从datatable或dataset建立的新类也不妨实行iserializable接口。固然,你不妨为新类采用一个各别的串行化计划。一个大略而灵验的本领即是将datatable类的一切分子映照到数组和值分子中。应用一个派生的类和一个自设置的串行化计划不妨为一个dataset东西俭朴多达80%的磁盘空间。俭朴的空间的比例在于于dataset中的数据典型。你的数据越鉴于文本,俭朴的空间越多。但是,应用二进制的blob字段只不妨俭朴大概25%的空间(载入一个完备的例子)。9. 采用一个符合你的数据的分页体制datagrid效劳器控件使咱们不妨更简单地在web运用步调中以长度可变的页面来表露数据了。该控件有绑定和方法化功效,它不妨接收一个ado.net数据东西并为欣赏器天生html代码。出于本能的因为,在页面包车型的士视图状况,datagrid并没有缓存数据源的实质。所以,当归来页面时,你就必需弥补grid。要实行这一点不妨用两种本领:在web效劳器大将数据源动作完全或一局部缓存起来,而后读回;大概对每个乞求从物理数据库加载所需的记载。即使你采用第一种本领,那么数据就从保存中只被读取一次,生存在一个缓存中,并为此后的postback事变读回。咱们常常用外存中的全部东西(如session或cache)来生存这个数据。咱们用dataset来收集一切须要的数据并将它生存在外存中。将一个dataset东西生存在session中同ado中的线程含意并不一律,然而经过缩小web效劳器可用的外存仍不妨感化可扩充性。即使要表露的数据是一定于session的,那么在历次归来页面时加载记载页面就比用一个dataset和asp.net全部东西来缓存数据要好。编写得很好的sql代码不妨将截止集分红很多页,再加上datagrid控件内置的自设置分页体制,咱们就不妨获得最好的处置计划来维持asp.net运用步调的可扩充性和杰出的本能了。对于windows运用步调,我的倡导凑巧差异。台式运用步调很符合运用割断的编制程序形式(dataset和其它ado.net东西使这种形式变得更大略了)。固然,这并不表示着,你不妨在存户端高枕无忧地载入不计其数的记载。纵然你不妨将ado.net东西用来任何品种的.net运用步调,但怎样运用它们是随简直情景的各别而各别的。10. 考察多个截止集按照查问的语法,你不妨归来多个截止集。缺省情景下,data reader是坐落第一个截止集上的。你不妨用read本领在暂时截止会合震动察看记载。在找到结果一个记载时,read本领归来false,不复连接读取。你该当用nextresult本领变化到下一个截止集。即使没有更多的须要读的截止集了,那么该本领归来false。底下的代码说领会怎样在一切归来的截止会合考察一切的记载:dim reader as sqldatareader cmd.connection.open()reader = cmd.executereader()do ' move through the first resultset while reader.read() ' access the row end whileloop while reader.nextresult()reader.close()cmd.connection.close()当你读一个行的实质时,不妨经过索引或称呼来辨别列。应用索引不妨更快,由于供给者不妨径直加入到缓冲器中。即使你指定列名,供给者就用getordinal本领将称呼变换成相映的索引,而后实行鉴于索引的考察。提防,对于sql server data reader来说,一切的getxxx本领本质上都挪用了相映的getsqlxxx本领。对于oracle data reader来说,情景是一致的,当地数据老是被写进.net framework典型中。oracledatareader类为它本人的里面典型供给了一组独占的getxxx本领。那些本领囊括getoraclebfile、getoraclebinary和getoracledatetime等。差异,ole db和odbc readers惟有独立的一组get本领。.net framework 1.1版经过增添本领hasrows扩充了data readers的编制程序接口,该本领归来一个boolean值来证明能否有很多行须要读。(这是asp.net 1.0的一个不及之处。)但是,该本领并没有报告咱们灵验的行的数目。同样,也没有本领或本领使咱们提早领会仍旧归来了几何截止集。在oracle数据库编制程序中,一个查问或一个保存进程归来的多个截止集是经过多个ref cursor东西处置的。有几何截止集,你就必需将几何输入参数同吩咐关系起来,再不nextresult本领不妨用来oracle数据库。在吩咐文本中,一个ado.net截止集同一个oracle ref cursor是普遍的。输入参数名必需与南针名配合,它们的典型必需是oracletype.cursor。比方,即使要运转的保存进程(或吩咐文本)援用了两个南针(employees和orders),那么底下的代码就说领会怎样举行树立以归来两个截止集:dim p1 as oracleparameter p1 = cmd.parameters.add("employees", oracletype.cursor)p1.direction = parameterdirection.outputdim p2 as oracleparameterp2 = cmd.parameters.add("orders", oracletype.cursor)p2.direction = parameterdirection.output在上头的代码中,cmd是一个oraclecommand东西,它指向一个吩咐或一个保存进程。它实行代码,创造了两个ref cursor,称为employees和orders。ref cursor的称呼和ado.net输入参数的称呼必需配合。ado.net东西形式包括两个重要的局部——托管供给者和database-agnostic的容器类,如dataset。托管供给者是数据源贯穿器的新典型;它们包办了鉴于com的ole db供给者。到我写这篇作品时为止,惟有少量几个托管供给者来贯穿贸易dbms。.net framework 1.1版只包括几个当地供给者——用来sql server、oracle和一切ole db的供给者和odbc启动步调。第三方的供给商也扶助mysql并为oracle供给了可供采用的供给者。ado.net看上去一致于ado,并且托管供给者在构造上同ole db供给者也是不妨比拟的。除去那些一致点外,在ado.net中举行灵验的编制程序还须要一套新的本领融洽的本领。在大普遍情景下,你不妨经过编写代码获得很多本领,并积聚东西形式上面的体味。当你在进一步接洽ado.net编制程序时,记取我在正文中所讲的这10个ado.net本领吧。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.