用SqlClient的Command 和DataReader對象代替ADODB能極大地提高性能
當開發人員用現有的VB
代碼測試Visual Studio
NET的發行版時
Visual Basic Upgrade Wizard會超時
該Wizard並不是全能的
但我發現它很適合升級復雜程度適度
數據驅動的VB
客戶端和中間層組件
如果你在VB
代碼中指定缺省對象屬性——如txtWhatever
Text和Recordset
Fields(n)
Value
那麼創建Wizard生成的Visual Basic
NET代碼所需做的修改就相當少了
當Wizard遇到數據訪問代碼
它就會跳過去
客戶端應用程序或組件最後形成一個ADODB
x COM
參照原來的MDAC版本
數據訪問代碼保持不變
除了IsNull由IsDbNull代替
這時
你可能會產生這樣的實際想法
如果升級的版本可以用
為什麼還要修改它?
這就是給SQL Server
用戶的回答
將ADODB
Connection
Command和Recordset對象移植成ADO
NET中SqlClient相當的輕量級的對象
會加速你的數據密集的前端
中間層組件和ASP
NET XML Web services
我迄今所做的測試表明
從ADODB移植到SqlClient
你可以期望有
%或更高的性能增益
對SQL Server
和
來說
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
見圖
)及其四個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 方法(見列表
)中的一段例子
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()) =
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代碼(見列表
)
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 < >
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 =
Then
Or yet another test
Success
so commit
trnCharge
Commit()
Else
trnCharge
Rollback()
End If
End With
SqlTransaction對象的一個附加的優點是它支持部分返回操作用的T
SQL指定的交易保存點
表
顯示增加
個定單到OakLeaf Consumer Electronics應用程序樣例的六個數據庫所需的平均秒數
兩個
Local
配置(單一的服務器)和第一個
Remote
配置測量了將客戶端和組件或者XML Web services從ADO/OLE DB移植到SqlClient性能方面的改進
Remote
XML Web services運行在另一個服務器上
該服務器通過一個
Mpbs的LAN與客戶機相連
service upgrades only
配置只測量移植XML Web services的好處
這兩個測試都用升級的OCE
Client測試工具
的確
你的得數會不同
但是
你可以打賭
通過轉換成SqlClient對象
你的數據密集的客戶端
組件和XML Web services將會得到
%到
%的性能增益
另外
你排除了對微軟遺留的COM組件的依賴
如果SQL Server是你的目標數據庫
SqlClient就是應該用的
NET方式
From:http://tw.wingwit.com/Article/program/net/201311/12801.html