轉:VB6.0資料庫訪問技術與常式解析
本文簡要分析了VB6.0訪問資料庫的幾種技術,並在此基礎上總結出幾個實用的資料庫開發經驗
引言
作為微軟旗下一款優秀的RAD工具,VB在資料庫應用開發方面的能力十分強大。微軟設計了多種資料庫存取方法,下面通過對VB訪問資料庫的多種技術進行深入剖析,並總結出實際開發中的幾點經驗。希望能夠對那VB的初學者有所協助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的環境下進行的)
一. DAO、RDO、ODBC和ADO
在VB的開發環境中,可以使用三種資料庫訪問方式,它們分別是:Data Access Objects(DAO)、遠端資料物件(RDO)和ADO物件模型。
DAO:
Data Access Objects是用來顯露了Microsoft Jet資料庫引擎(最早是給Microsoft Access 所使用,現在已經支援其它資料庫),並允許開發人員通過ODBC直接連接到其他資料庫一樣,直接連接到 Access 表。DAO 最適用於單系統應用程式或在小範圍本地分布使用。其內部已經對Jet資料庫的訪問進行了加速最佳化,而且其使用起來也是很方便的。所以如果資料庫是Access資料庫且是本地使用的話,建議使用這種訪問方式。
VB已經把DAO模型封裝成了Data控制項,分別設定相應的DatabaseName屬性和RecordSource屬性就可以將Data控制項與資料庫中的記錄源串連起來了。以後就可以使用Data控制項來對資料庫進行操作。
RDO
RDO(Remote Data Objects)遠端資料物件是一個到ODBC的、物件導向的資料提供者,它同便於使用的DAO style組合在一起,提供了一個介面,形式上展示出所有ODBC的底層功能和靈活性。儘管RDO在很好地訪問Jet或ISAM資料庫方面受到限制,而且它只能通過現存的ODBC驅動程式來訪問關聯式資料庫。但是,RDO已被證明是許多SQL Server、Oracle 以及其他大型關聯式資料庫開發人員經常選用的最佳介面。RDO提供了用來訪問預存程序和複雜結果集的更多和更複雜的對象、屬性,以及方法。
和DAO一樣,在VB中也把其封裝為RDO控制項了,其使用方法與DAO控制項的使用方法完全一樣。
ODBC
ODBC(Open Database Connectivity,開放資料庫互連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關資料庫的一個組成部分,它建立了一組規範,並提供了一組對資料庫訪問的標準API(API)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支援,使用者可以直接將SQL語句送給ODBC。
一個基於ODBC的應用程式對資料庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的資料庫操作由對應的DBMS的ODBC驅動程式完成。也就是說,不論是FoxPro、Access還是Oracle資料庫,均可用ODBC API進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的資料庫。
一個完整的ODBC由下列幾個組件組成:
1. 應用程式(Application)
ODBC管理器(Administrator)。該程式位於Windows 95控制台(Control Panel)的32位ODBC內,其主要任務是管理安裝的ODBC驅動程式和管理資料來源。
驅動程式管理器(Driver Manager)。驅動程式管理器包含在ODBC32.DLL中,對使用者是透明的。其任務是管理ODBC驅動程式,是ODBC中最重要的組件。
2. ODBC API
ODBC 驅動程式。是一些DLL,提供了ODBC和資料庫之間的介面。
資料來源。資料來源包含了資料庫位置和資料庫類型等資訊,實際上是一種資料連線的抽象。
ODBC串連目前僅僅限於關係型資料庫,對於其他資料來源比如EXCEL、文字檔都不能進行訪問,而且有很多DBMS(資料庫管理系統)都不能充分的支援其所有的功能。相比之下,OLEDB可以存取任何形式的資料,所以其功能是相當的強大,它也指導了目前技術發展的方向。
ADO
ADO(ActiveX Data Object)是DAO/RDO的後繼產物。ADO 2.0在功能上與RDO更相似,而且一般來說,在這兩種模型之間有一種相似的映射關係。ADO"擴充"了DAO和 RDO 所使用的物件模型,這意味著它包含較少的對象、更多的屬性、方法(和參數),以及事件。
作為最新的資料庫訪問模式,ADO的使用也是簡單易用,所以微軟已經明確表示今後把重點放在ADO上,對DAO/RDO不再作升級,所以ADO已經成為了當前資料庫開發的主流。
ADO涉及的資料存放區有DSN(資料來源名稱)、ODBC(開放式資料連線)以及OLE DB三種方式。後面的常式將詳細講解這三種方式的具體訪問實現。
要使用ADO,必須清楚ADO的對象階層,其大體上分為以下7個對象層次:
1、 Command 對象:包含關於某個命令,例如查詢字串、參數定義等的資訊。Command 對象在功能上和 RDO的rdoQuery 對象相似。
2、 Connection 對象:包含關於某個資料提供者的資訊。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,並且包含了關於結構描述的資訊。它還包含某些 RDOEnvironment 對象的功能,例如transaction 控制項。
3、 Error對象:包含資料提供者出錯時的擴充資訊。Error 對象在功能上和 RDO 的rdoError 對象相似。
4、 Field 對象:包含記錄集中資料的某單個列的資訊。Field 對象在功能上和 RDO的rdoColumn 對象相似。
5、 Parameter 對象:包含參數化的Command對象的某單個參數的資訊。該 Command對象有一個包含其所有Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象相似。
6、 Property對象:包含某個 ADO 對象的提供者定義的特徵。沒有任何等同於該對象的RDO,但DAO有一個相似的對象。
7、Recordset對象:用來儲存資料操作返回的記錄集。此對象和Connection對象是所有對象最重要的兩個對象。
當然,對於初級使用者來說,我們只需要掌握其中的Connection對象和RecordSet對象就可以實現基本的資料庫操作,在後面的經驗介紹裡面我將給出詳細的介紹。
二. 開發經驗小結:
前面總體上介紹了一下當前在VB平台下的資料庫訪問技術,這些技術也是當前資料庫技術的主流。下面筆者結合近幾年的開發經驗,給出一些開發經驗和小技巧,以供參考:
經驗一:如果資料量不大,而且要求開發週期短的情況,建議使用DAO+Access雖然DAO功能並不強大,但是其對Jet引擎進行了加速最佳化處理,所以這種搭配應該是比較好的選擇。
經驗二:RDO當前已經用的很少了,一般用ADO來替代。
經驗三:(本經驗很重要)使用ADO開發時,串連資料庫的方式有三種(前面已經敘述了),其中DSN需要使用者首先使用要將所要操縱的資料庫設定為資料庫源並給其命名。方法是在控制台->管理工具->資料來源(ODBC)下面進行配置。比如設定的資料來源名稱為data,那麼可以通過下面幾行代碼來串連資料庫:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'串連資料庫
conn.Open "dsn=data"
'開啟資料來源(即選定操作的資料對象)
rs.Open SQL語句, conn
但是如果是使用ODBC和OLEDB的方式進行串連,那麼大家一定知道在連接字串上那一長串的代碼,不要說對於初學者,就是對於那些經驗豐富的程式員來說,也很難記住這一串代碼。那麼如何可以記住這一串代碼呢?其實,方法很簡單,只要添加一個ADO Data控制項,然後在其屬性框中使用嚮導進行設定後,那麼最後嚮導就會自動產生一段ConnectionString,只需要將這一行代碼拷貝下來然後放到conn.open之後的連接字串參數的位置上就可以了。這條經驗希望讀者能夠記住,實際開發中很實用。
經驗四:前面講到手動設定ODBC資料來源,這裡可以通過程式來進行動態設定。首先要清楚的是ODBC的詳細資料全部存放在註冊表的下述索引值內:"HKEY_LOCAL_MACHINE/SOFTWARE/ODBC",通過調用Win32函數WriteProfileString來對相應的索引值進行修改即可達到目的。
經驗五:通常將資料庫的串連代碼和資源釋放代碼放入各自特定的函數裡面,因為一般大一點的程式裡需要經常對這兩個功能模組進行調用,這樣做就可以提高效率,當然很多時候都需要寫成串連池的形式。
經驗六:使用VB在SQL中處理含單引號的字串時,對字串資料都用單引號引起來,如:
Select * from MyTable Where ID='FirstID'
若其中的FirstID為First'ID,即中間多出一個單引號,則上述寫法將導致錯誤,解決的辦法是將字串中的每一個單引號用兩雙引號替換,下面的函數StrToSQL完成該功能,並用單引號將處理後的字串引起來:
Private Function StrToSQL(ByVal strValue As String) As String
StrToSQL = "'" + Replace(strValue, "'", "''") + "'"
End Function
在寫SQL時如有字串資料,不管其中有沒有單引號,都可以這樣使用:
strValue="First'Id"
strSQL="Select * from MyTable Where ID="+StrToSQL(strValue)
三. 執行個體解析
下面介紹一個執行個體,來消化以上的相關知識。這裡我在一個程式介面下實現了DAO,ADO,ODBC,OLEDB四種資料庫訪問方式。
程式碼分析:
'整個程式功能是選擇不同的串連方式來進行顯示工作,三種方式顯示效果完全相同
'下面是主程式過程
Private Sub Command1_Click()
Dim selitem As Integer
'判斷串連資料庫的方式
If Option1.Value = True Then
selitem = 1
Else
If Option2.Value = True Then
selitem = 2
Else
selitem = 3
End If
End If
'選取不同的資料庫連接方式
Select Case selitem
Case 1:
'使用DAO的資料庫連接方式
Call ShowByDAO
Case 2:
'使用ADO的資料庫連接方式
Call ShowByADO
Case 3:
'使用ODBC的資料庫連接方式
Call ShowByODBC
Case 4:
'使用OLEDB的資料庫連接方式
Call ShowByOLEDB
End Select
End Sub
Private Sub ShowByDAO()
'使用DAO的資料庫連接方式
Dim db As Database
Dim rs As Recordset
Dim sqlstr$ '存放查詢語句
Set db = OpenDatabase(App.Path & "/db1.mdb")
sqlstr = "select * from 成績表"
Set rs = db.OpenRecordset(sqlstr)
'顯示結果
Call GridShow(rs)
End Sub
Sub ShowByADO()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'使用資料來源來串連資料庫
conn.Open "dsn=data"
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "select * from 成績表", conn
Call GridShowOfADO(rs)
End Sub
Sub ShowByODBC()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'使用資料來源來串連資料庫
conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=data"
rs.Open "select * from 成績表", conn
'顯示結果
Call GridShowOfADO(rs)
End Sub
Sub ShowByOLEDB()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'使用資料來源來串連資料庫
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path & "/db1.mdb" + ";Persist Security Info=False"
rs.Open "select * from 成績表", conn
'顯示結果
Call GridShowOfADO(rs)
End Sub
Sub GridShow(rs As Recordset)
'對dao方式進行顯示工作
MSFlexGrid1.TextMatrix(0, 0) = "姓名"
MSFlexGrid1.TextMatrix(0, 1) = "性別"
MSFlexGrid1.TextMatrix(0, 2) = "語文"
MSFlexGrid1.TextMatrix(0, 3) = "數學"
MSFlexGrid1.TextMatrix(0, 4) = "英語"
rs.MoveLast
MSFlexGrid1.Rows = rs.RecordCount + 1
MSFlexGrid1.Cols = rs.Fields.Count
Dim i%
i = 1
rs.MoveFirst
While (Not rs.EOF)
MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
rs.MoveNext
i = i + 1
'If (rs.EOF = True) Then
' Exit For
Wend
End Sub
Sub GridShowOfADO(rs As ADODB.Recordset)
'對ado方式進行顯示工作
MSFlexGrid1.TextMatrix(0, 0) = "姓名"
MSFlexGrid1.TextMatrix(0, 1) = "性別"
MSFlexGrid1.TextMatrix(0, 2) = "語文"
MSFlexGrid1.TextMatrix(0, 3) = "數學"
MSFlexGrid1.TextMatrix(0, 4) = "英語"
'注意recordcount屬性必須在目前記錄指標在最後一條記錄時才會返回正確的值
rs.MoveLast
MSFlexGrid1.Rows = rs.RecordCount + 1
MSFlexGrid1.Cols = rs.Fields.Count
Dim i%
i = 1
rs.MoveFirst
While (Not rs.EOF)
MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
rs.MoveNext
i = i + 1
Wend
End Sub
Private Sub Command2_Click()
End
End Sub
上述代碼已經在Windows 2000 professional和Visual Basic 6.0的環境下調試成功。
四.小結
本文通過對資料庫訪問相關技術的分析與總結,提出若干有價值的經驗。借鑒這些經驗,會給開發帶來一定的便利。