使用Command 和DataReader对象加速访问
用sqlclient的command 和datareader对象代替adodb能极大地提高性能。
当开发人员用现有的vb6代码测试visual studio .net的发行版时,visual basic upgrade wizard会超时。该wizard并不是全能的,但我发现它很适合升级复杂程度适度,数据驱动的vb6客户端和中间层组件。如果你在vb6代码中指定缺省对象属性――如txtwhatever.text和recordset.fields(n).value,那么创建wizard生成的visual basic .net代码所需做的修改就相当少了。
当wizard遇到数据访问代码,它就会跳过去。客户端应用程序或组件最后形成一个adodb 2.x com,参照原来的mdac版本。数据访问代码保持不变,除了isnull由isdbnull代替。这时,你可能会产生这样的实际想法:如果升级的版本可以用,为什么还要修改它?
这就是给sql server 2000用户的回答:将adodb.connection, command和recordset对象移植成ado.net中sqlclient相当的轻量级的对象,会加速你的数据密集的前端,中间层组件和asp.net xml web services。我迄今所做的测试表明,从adodb移植到sqlclient,你可以期望有10%或更高的性能增益。
对sql server 7.0和2000来说,.net framework的system.data.sqlclient名字空间代表了.net data provider(原来的“managed provider”)。sqlclient通过与sql server以其本地的tabular data stream (tds) 格式直接通讯,去掉了adodb和ole db。sqlconnection和sqlcommand对象相当于adodb.connection和adodb.command 对象,并有类似的――但并不是同样的――属性和方法。sqldatareader对象为只能向前的,只读的(firehose) adodb.recordsets提供了一个高性能的替代品。你用sqldataadapter填充datasets中的分离的datatables。微软把这四个sql…对象称为.net data provider的“核心元素”。
(来源 www.iocblog.net)
为了做前/后性能比较,我对我的样例oakleaf consumer electronics windows form 客户端 (oce-client,见图1)及其四个asp.net xml web services做了升级,从ado/ole db 转换到asp.net的sqlclient provider,这花了我约一天的时间(包括初始测试)。通过点击oakleaf web site中的oce-client链接,你可以测试oce-client的asp.net版本,并对windows form版本和它所使用的asp.net xml web services有更多了解。
从adodb转到sqlclient对象的第一步就是在你的class声明前,增加一个imports system.data.sqlclient的声明。将cnnname= new adodb. connection改成cnnname = new sqlconnection。从连接字符串中去掉provider = sqloledb;sqlconnection指定了sqlclient provider。最后,用open( )方法打开连接。下面是omegabank.verifyorhold web 方法(见列表1)中的一段例子:
dim cnnverify as new sqlconnection()
strnetconn = "data source=" & strserver & ";initial
catalog=omb_network;uid=" & struser & ";pwd=" & strpwd
cnnverify.connectionstring = strnetconn
cnnverify.open()
你不能直接在一个sqlconnection对象上打开adodb.recordset的sqlclient相当对象。作为替代,你可以在打开的sqlconnection上创建一个sqlcommand对象,如下例:strsql = "select count(merchantid) from merchants " & _
"where merchantid = " & cstr(lngmerchantid)
dim cmmverify as sqlcommand = cnnverify.createcommand
with cmmverify
commandtype = commandtype.text
commandtext = strsql
if cint(.executescalar()) = 0 then
' not found
end if
end with
作为选择,你可以将一个打开的sqlconnection对象赋值到一个新的sqlcommand.connection属性,如下例:dim cmmverify as new sqlcommand
dim rdrverify as sqldatareader
with cmmverify
.connection = cnnverify
commandtype = commandtype.text
commandtext = strsql
rdrverify = .executereader()
end with
这些例子说明了三个sqlcommand.execute…方法的两个:executescalar返回行集合的第一(通常是唯一的)行的第一列的值;executereader返回一个sqldatareader对象,每用一次read方法,该对象返回一列。两种方法都是快速的,并消耗最少的资源。在你用close方法前,sqldatareader需要专用相关的sql server连接。第三个sqlcommand方法是executenonquery,它不返回数据。
sqldatareader对象的行为与xmlreader和textreader对象很像。读取器在相当于adodb.recordset的bof位置启动;如果有另一个记录需要读,read方法返回true。你在一个while sdrreader.read()...end while的回路中来回读取数据。用sdrreader.getdatatype (intcolumn)方法得到你指定的本地.net数据类型中的列的数据。
新的sqltransaction对象代替了adodb.connection对象的committrans, committrans和rollbacktrans 方法。作为替代,你声明一个sqltransaction对象,通过调用sqlconnection.begintransaction方法创建它。下面是摘自omegabank.chargeorcredit web方法的一个简单的sqltransaction代码(见列表2):dim cmmcharge as [new] sqlcommand
dim trncharge as sqltransaction
with cmmcharge
'instantiate the sqltransaction object
trncharge = cnncharge.begintransaction
strsql = "insert, update, or delete statement"
'assign the sqltransaction object to the
'sqlcommand object
.transaction = trncharge
.commandtext = strsql
lngreccnt = .executenonquery
if lngreccnt < > 1 then 'or some other test
'error, so roll back
trncharge.rollback()
end if
curtransactamt = -curtransactamt
strsql = _
"another insert, update, or delete statement"
.commandtext = strsql
lngreccnt = .executenonquery
if lngreccnt = 1 then 'or yet another test
'success, so commit
trncharge.commit()
else
trncharge.rollback()
end if
end with
sqltransaction对象的一个附加的优点是它支持部分返回操作用的t-sql指定的交易保存点。
表1显示增加5,000个定单到oakleaf consumer electronics应用程序样例的六个数据库所需的平均秒数。两个“local”配置(单一的服务器)和第一个“remote”配置测量了将客户端和组件或者xml web services从ado/ole db移植到sqlclient性能方面的改进。“remote” xml web services运行在另一个服务器上,该服务器通过一个100-mpbs的lan与客户机相连。“service upgrades only”配置只测量移植xml web services的好处;这两个测试都用升级的oce-client测试工具。
的确,你的得数会不同,但是,你可以打赌,通过转换成sqlclient对象,你的数据密集的客户端,组件和xml web services将会得到10%到15%的性能增益。另外,你排除了对微软遗留的com组件的依赖。如果sql server是你的目标数据库,sqlclient就是应该用的.net方式。
Tag: 加速访问 ,Command ,DataReader
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。