用SqlClient的Command 和DataReader对象代替ADODB能极大地提高性能 当开发人员用现有的VB代码测试Visual Studio NET的发行版时Visual Basic Upgrade Wizard会超时该Wizard并不是全能的但我发现它很适合升级复杂程度适度数据驱动的VB客户端和中间层组件如果你在VB代码中指定缺省对象属性——如txtWhateverText和RecordsetFields(n)Value那么创建Wizard生成的Visual Basic NET代码所需做的修改就相当少了 当Wizard遇到数据访问代码它就会跳过去客户端应用程序或组件最后形成一个ADODB x COM参照原来的MDAC版本数据访问代码保持不变除了IsNull由IsDbNull代替这时你可能会产生这样的实际想法如果升级的版本可以用为什么还要修改它? 这就是给SQL Server 用户的回答将ADODBConnection Command和Recordset对象移植成ADONET中SqlClient相当的轻量级的对象会加速你的数据密集的前端中间层组件和ASPNET XML Web services我迄今所做的测试表明从ADODB移植到SqlClient你可以期望有%或更高的性能增益 对SQL Server 和来说NET Framework的SystemDataSqlClient名字空间代表了NET Data Provider(原来的managed provider)SqlClient通过与SQL Server以其本地的Tabular Data Stream (TDS) 格式直接通讯去掉了ADODB和OLE DBSqlConnection和SqlCommand对象相当于ADODBConnection和ADODBCommand 对象并有类似的——但并不是同样的——属性和方法SqlDataReader对象为只能向前的只读的(firehose) ADODBRecordsets提供了一个高性能的替代品你用SqlDataAdapter填充DataSets中的分离的DataTables微软把这四个Sql…对象称为NET Data provider的核心元素 为了做前/后性能比较我对我的样例OakLeaf Consumer Electronics Windows form 客户端 (OCEClient见图)及其四个ASPNET XML Web services做了升级从ADO/OLE DB 转换到ASPNET的SqlClient provider这花了我约一天的时间(包括初始测试)通过点击OakLeaf Web site中的OCEClient链接你可以测试OCEClient的ASPNET版本并对Windows form版本和它所使用的ASPNET XML Web services有更多了解 从ADODB转到SqlClient对象的第一步就是在你的Class声明前增加一个Imports SystemDataSqlClient的声明将cnnName= New ADODB Connection改成cnnName = New SqlConnection从连接字符串中去掉Provider = SQLOLEDBSqlConnection指定了SqlClient provider最后用Open( )方法打开连接下面是OmegaBankVerifyOrHold Web 方法(见列表)中的一段例子 Dim cnnVerify As New SqlConnection() strNetConn = Data Source= & strServer & ;Initial Catalog=OMB_Network;UID= & strUser & ;PWD= & strPwd cnnVerifyConnectionString = strNetConn cnnVerifyOpen() 你不能直接在一个SqlConnection对象上打开ADODBRecordset的SqlClient相当对象作为替代你可以在打开的SqlConnection上创建一个SqlCommand对象如下例strSQL = SELECT COUNT(MerchantID) FROM Merchants & _ WHERE MerchantID = & CStr(lngMerchantID) Dim cmmVerify As SqlCommand = cnnVerifyCreateCommand With cmmVerify CommandType = CommandTypeText CommandText = strSQL If CInt(ExecuteScalar()) = Then Not found End If End With 作为选择你可以将一个打开的SqlConnection对象赋值到一个新的SqlCommandConnection属性如下例Dim cmmVerify As New SqlCommand Dim rdrVerify As SqlDataReader With cmmVerify Connection = cnnVerify CommandType = CommandTypeText CommandText = strSQL rdrVerify = ExecuteReader() End With 这些例子说明了三个SqlCommandExecute…方法的两个ExecuteScalar返回行集合的第一(通常是唯一的)行的第一列的值ExecuteReader返回一个SqlDataReader对象每用一次Read方法该对象返回一列两种方法都是快速的并消耗最少的资源在你用Close方法前SqlDataReader需要专用相关的SQL Server连接第三个SqlCommand方法是ExecuteNonQuery它不返回数据 SqlDataReader对象的行为与XmlReader和TextReader对象很像读取器在相当于ADODBRecordset的BOF位置启动如果有另一个记录需要读Read方法返回True你在一个While sdrReaderRead()End While的回路中来回读取数据用sdrReaderGetDataType (intColumn)方法得到你指定的本地NET数据类型中的列的数据 新的SqlTransaction对象代替了ADODBConnection对象的CommitTrans CommitTrans和RollbackTrans 方法作为替代你声明一个SqlTransaction对象通过调用SqlConnectionBeginTransaction方法创建它下面是摘自OmegaBankChargeOrCredit Web方法的一个简单的SqlTransaction代码(见列表)Dim cmmCharge As [New] SqlCommand Dim trnCharge As SqlTransaction With cmmCharge Instantiate the SqlTransaction object trnCharge = cnnChargeBeginTransaction strSQL = INSERT UPDATE or DELETE statement Assign the SqlTransaction object to the SqlCommand object Transaction = trnCharge CommandText = strSQL lngReccnt = ExecuteNonQuery If lngReccnt < > Then Or some other test Error so roll back trnChargeRollback() End If curTransactAmt = curTransactAmt strSQL = _ Another INSERT UPDATE or DELETE statement CommandText = strSQL lngReccnt = ExecuteNonQuery If lngReccnt = Then Or yet another test Success so commit trnChargeCommit() Else trnChargeRollback() End If End With SqlTransaction对象的一个附加的优点是它支持部分返回操作用的TSQL指定的交易保存点 表显示增加个定单到OakLeaf Consumer Electronics应用程序样例的六个数据库所需的平均秒数两个Local配置(单一的服务器)和第一个Remote配置测量了将客户端和组件或者XML Web services从ADO/OLE DB移植到SqlClient性能方面的改进Remote XML Web services运行在另一个服务器上该服务器通过一个Mpbs的LAN与客户机相连service upgrades only配置只测量移植XML Web services的好处这两个测试都用升级的OCEClient测试工具 的确你的得数会不同但是你可以打赌通过转换成SqlClient对象你的数据密集的客户端组件和XML Web services将会得到%到%的性能增益另外你排除了对微软遗留的COM组件的依赖如果SQL Server是你的目标数据库SqlClient就是应该用的NET方式 |