熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用Command 和DataReader對象加速訪問

2013-11-13 10:10:39  來源: .NET編程 

  用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 providerSqlClient通過與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方式
From:http://tw.wingwit.com/Article/program/net/201311/12801.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.