簡介
在NET應用軟件開發人員看來使用DB與使用其它任何其它關系數據庫沒有區別人們可以看到無數使用SQL Server以及甲骨文公司產品執行數據庫任務的例子但關於使用包括NET在內的微軟公司技術訪問DB數據庫的文檔就遠沒有那麼多了
目前開發人員可以使用不同的訪問技術通過編程的方式將NET客戶端連接到DB上這些代碼從根本上來說是基本相同的但仍然存在一些我們需要考慮的有趣的限制
DB架構慨覽
DB數據庫引擎的基本元素是數據庫對象系統目錄目錄和配置文件所有的數據存取都通過SQL界面進行我們可以只將DB Univeral Database(UDB)作為數據庫服務器運行這不要求使用其它的產品但對於遠程的客戶端而言我們還需要其它一些產品
DB UDB的服務器組件提供了對使用TCP/IPSNA或IPX/SPX協議與數據庫服務器進行通訊的支持這就能夠使運行管理客戶端運行時間庫或應用程序開發客戶端的遠程客戶端進行訪問應用程序開發客戶端組件是面向數據庫應用程序開發人員的工具集它包括庫文件頭文件API和樣板代碼
我們主要關心的是能夠通過網絡訪問數據庫服務器的客戶端組件通過使用DB Connect我們的NET應用程序能夠訪問基於主機的DB系統例如DB for AS/DB for OS/DB for VSE等
連接到DB的方式決定了我們能夠完成的任務有三種技術可以從NET連接到DB
使用OleDb NET Managed Provider如果運行的是DB V或更低的版本以及COM對象是調用者時微軟和IBM二家公司都建議使用OleDb數據提供者訪問大多數DB數據在NET Framework中OleDb提供商是通過COM InterOp表現出來的並使用可用於ADO開發的驅動程序
使用ODBC NET Managed Provider這種方式提供了對本地ODBC驅動程序的訪問與OLEDb NET Data Provider提供對本地OLEDb提供者訪問的方式相同ODBC NET Data Provider是NET Framework的一個附加組件它能夠與所有兼容的ODBC驅動程序配合使用
使用IBM DB NET Provider(β)這種方式提供了對將ADONET連接到DB V的支持DB NET Data Provider是Visual Studio NET Framework的一個內插式附件它能夠訪問在運行在不同硬件和操作系統平台上的DB·數據庫服務器目前它仍然處於β測試階段但IBM公司很快會發布正式產品DB Net Data Provider能夠將使用ADONET開發的應用程序連接到下面的DB數據庫服務器上
·運行在WindowsUNIX和Linux平台上的DB Universal Database Version
·運行在z/OSOS/ V以及使用DB Connect V組件的更高版本的操作系統上的DB Universal Database
不同的連接字符串顯示出不同情況下的語法差別
OleDb連接字符串
Provider=IBMDADB;User ID=dbadmin;Password=dbadmin;Data Source=SAMPLE
ODBC連接字符串
DSN=DBV;UID=dbadmin;PWD=dbadmin
IBM Managed Provider連接字符串
Database=SAMPLE;User ID=dbadmin;Password=dbadmin;Server=IREK
代碼級訪問的比較
在開發DB數據訪問代碼時大多數的操作在很大程度上與訪問其它數據庫相同下面我們對連接技術的一些代碼進行比較
在下面的每個代碼片斷中我們將展示一些數據庫訪問和數據管理的技巧請讀者注意每種技術的哪些步驟相同我們首先創建連接對象再創建一個命令對象在這個簡單的例子中我們只訪問這一特定數據庫表中指定行列中的一個標量值最後我們執行該命令的ExecuteScalar()方法返回該整數
使用Ole Db技術
private OleDbConnection cn = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(SELECT COUNT(*) FROM STAFF cn); int rc = ConvertToInt(cmdExecuteScalar());
使用ODBC
private OdbcConnection cn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand(SELECT COUNT(*) FROM STAFF cn);
int rc = ConvertToInt(cmdExecuteScalar());
使用IBM的Managed Provider
private DBConnection cn = new DBConnection(connectionString);
DBCommand cmd = new DBCommand(SELECT COUNT(*) FROM STAFF cn);
int rc = ConvertToInt(cmdExecuteScalar());
功能的比較
根據選擇的訪問技術和使用的數據庫版本我們可以使用不同的功能另外根據需要完成的工作我們還需要選擇連接策略
為了使讀者能夠更好的選擇連接技術我整理出了一個能夠在決策中使用的路線圖在路線圖中我找出了一些對於大多數以數據庫為中心的軟件開發項目中通用的功能
在下面的圖表中我對自己的心得進行了整理我根據是否允許完成特定的數據庫任務對三種訪問技術中的每一種都進行了評估評估的數據庫任務有
·Passthru SQL━━這一提供者是否支持通過動態開發的SQL語句形成的傳遞?
·簡單的存儲過程━━這一提供者支持包括返回結果在內的調用基本的存儲過程嗎?
·InOutInOut參數━━這一提供者支持調用存儲過程和利用參數傳遞變量數據嗎?
·日期和貨幣━━這一提供者支持由特定廠商提供可能造成問題的數據類型嗎?
·LOBs━━這一提供者支持大對象數據類型的處理嗎?
根據使用的連接技術我們能夠完成不同類型的任務因為每種提供者都有自己可以完成的工作有一些問題是我們值得注意的
例如ODBC不支持DB的存儲過程因此如果開發的應用軟件非常依賴於存儲過程我們在選擇訪問技術時就不能考慮ODBC而應當考慮OleDb或Managed ProviderOleDb不支持LOB數據類型如果要存取LOB類型的數據(例如JPEG文件)我們可以使用ODBC或Managed Provider目前Managed Provider不能在DB V或以前版本上運行除非在應用程序和基於主機的DB系統之間運行著DB Connect V
有趣的是在使用存儲過程的參數時DB V和OleDb有一個非常著名的bug我們能夠從存儲過程中返回數據但在OleDb+DB V平台上我們不能在應用程序與存儲過程之間傳遞參數
性能比較
為了衡量提供者的性能和向讀者提供指導我們將定義一個有效的測試腳本並對各種提供者的關健性能進行測試為了比較各種連接技術的性能我們開發了一些簡單的Web網頁一個網頁面向執行完全相同功能的測試這將使我們掌握分析不同連接技術情況下輸出的控制數據
如果嚴格地從性能的角度來看我們發現Managed Provider在訪問DB數據庫時的性能最高在這一簡單的測試中有二個重要的數字值得關注每秒鐘的請求(RPS)能夠使我們感受到訪問的規模OleDb和ODBC在這方面的表現基本相似但Managed Provider的表現要好一些(大約高%左右)收到最後一字節的時間(TTLB)是從終端用戶的角度看到的響應時間在這一方面Managed Provider的性能再次比OleDb和ODBC高出%左右
最值得注意的是盡管提供的功能不同但OleDb和ODBC在有負荷的情況下的性能基本相同IBM公司的Managed Provider的性能最好而且提供了在訪問DB V時最可靠的功能但是如果沒有DB Connect作中間體它不支持DB V以及更低的版本
結論
對於應用軟件開發人員而言使用DB作後端與使用其它通過ADO或ADONET訪問的關系數據庫一樣簡單ADONET為我們完成了所有抽象工作在選擇DB還是其它數據庫時盡管存在架構方面的考慮但作為開發人員我們的工作應當是可預測和可管理的
From:http://tw.wingwit.com/Article/program/net/201311/13751.html