分享
 
 
 

使用Command和DataReader对象加速访问

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

用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的“核心元素”。

为了做前/后性能比较,我对我的样例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方式。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有