您现在的位置:DotNet开发者 >> .NET开发 >> VC++.NET>> 内容正文

使用Command 和DataReader对象加速访问

编辑:周郎   来源:本站整理   发布时间:2008-06-17 00:06:57
您正在看的VC.NET教程是:使用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的“核心元素”。
  
  为了做前/后性能比较,我对我的样例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
【相关导航】
上一篇:用VC控制iis的属性 下一篇:.NET Compact Framework概览
【免责声明】
本站刊载此文仅为提供更多信息,不代表同意其说法,也不构成任何建议。有任何异议,请联络:web@zhoulang.net
相关文章
  • 很抱歉!还没有相关内容
站内搜索
小提示:苦寻不到想要的?不防搜索一下!
更多>>
DotNet最新文章
更多>>
网站运营最新文章