作為微軟旗下一款優(yōu)秀的RAD工具,VB在數(shù)據(jù)庫應(yīng)用開發(fā)方面的能力十分強大。微軟設(shè)計了多種數(shù)據(jù)庫訪問方法,下面通過對VB訪問數(shù)據(jù)庫的多種技術(shù)進行深入剖析,并總結(jié)出實際開發(fā)中的幾點經(jīng)驗。希望能夠?qū)δ荲B的初學者有所幫助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的環(huán)境下進行的)
一. DAO、RDO、ODBC和ADO
在VB的開發(fā)環(huán)境中,可以使用三種數(shù)據(jù)庫訪問方式,它們分別是:數(shù)據(jù)訪問對象(DAO)、遠程數(shù)據(jù)對象(RDO)和ADO對象模型。
DAO:
數(shù)據(jù)訪問對象是用來顯露了Microsoft Jet數(shù)據(jù)庫引擎(最早是給Microsoft Access 所使用,現(xiàn)在已經(jīng)支持其它數(shù)據(jù)庫),并允許開發(fā)者通過ODBC直接連接到其他數(shù)據(jù)庫一樣,直接連接到 Access 表。DAO 最適用于單系統(tǒng)應(yīng)用程序或在小范圍本地分布使用。其內(nèi)部已經(jīng)對Jet數(shù)據(jù)庫的訪問進行了加速優(yōu)化,而且其使用起來也是很方便的。所以如果數(shù)據(jù)庫是Access數(shù)據(jù)庫且是本地使用的話,建議使用這種訪問方式。
VB已經(jīng)把DAO模型封裝成了Data控件,分別設(shè)置相應(yīng)的DatabaseName屬性和RecordSource屬性就可以將Data控件與數(shù)據(jù)庫中的記錄源連接起來了。以后就可以使用Data控件來對數(shù)據(jù)庫進行操作。
RDO
RDO(Remote Data Objects)遠程數(shù)據(jù)對象是一個到ODBC的、面向?qū)ο蟮臄?shù)據(jù)訪問接口,它同易于使用的DAO style組合在一起,提供了一個接口,形式上展示出所有ODBC的底層功能和靈活性。盡管RDO在很好地訪問Jet或ISAM數(shù)據(jù)庫方面受到限制,而且它只能通過現(xiàn)存的ODBC驅(qū)動程序來訪問關(guān)系數(shù)據(jù)庫。但是,RDO已被證明是許多SQL Server、Oracle 以及其他大型關(guān)系數(shù)據(jù)庫開發(fā)者經(jīng)常選用的最佳接口。RDO提供了用來訪問存儲過程和復雜結(jié)果集的更多和更復雜的對象、屬性,以及方法。
和DAO一樣,在VB中也把其封裝為RDO控件了,其使用方法與DAO控件的使用方法完全一樣。
ODBC
ODBC(Open Database Connectivity,開放數(shù)據(jù)庫互連)是微軟公司開放服務(wù)結(jié)構(gòu)(WOSA,Windows Open Services Architecture)中有關(guān)數(shù)據(jù)庫的一個組成部分,它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標準API(應(yīng)用程序編程接口)。這些API利用SQL來完成其大部分任務(wù)。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。
一個基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫操作由對應(yīng)的DBMS的ODBC驅(qū)動程序完成。也就是說,不論是FoxPro、Access還是Oracle數(shù)據(jù)庫,均可用ODBC API進行訪問。由此可見,ODBC的最大優(yōu)點是能以統(tǒng)一的方式處理所有的數(shù)據(jù)庫。
一個完整的ODBC由下列幾個部件組成:
1. 應(yīng)用程序(Application)
ODBC管理器(Administrator)。該程序位于Windows 95控制面板(Control Panel)的32位ODBC內(nèi),其主要任務(wù)是管理安裝的ODBC驅(qū)動程序和管理數(shù)據(jù)源。
驅(qū)動程序管理器(Driver Manager)。驅(qū)動程序管理器包含在ODBC32.DLL中,對用戶是透明的。其任務(wù)是管理ODBC驅(qū)動程序,是ODBC中最重要的部件。
2. ODBC API
ODBC 驅(qū)動程序。是一些DLL,提供了ODBC和數(shù)據(jù)庫之間的接口。
數(shù)據(jù)源。數(shù)據(jù)源包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,實際上是一種數(shù)據(jù)連接的抽象。
ODBC連接目前僅僅限于關(guān)系型數(shù)據(jù)庫,對于其他數(shù)據(jù)源比如EXCEL、文本文件都不能進行訪問,而且有很多DBMS(數(shù)據(jù)庫管理系統(tǒng))都不能充分的支持其所有的功能。相比之下,OLEDB可以存取任何形式的數(shù)據(jù),所以其功能是相當?shù)膹姶?,它也指導了目前技術(shù)發(fā)展的方向。
ADO
ADO(ActiveX Data Object)是DAO/RDO的后繼產(chǎn)物。ADO 2.0在功能上與RDO更相似,而且一般來說,在這兩種模型之間有一種相似的映射關(guān)系。ADO"擴展"了DAO和 RDO 所使用的對象模型,這意味著它包含較少的對象、更多的屬性、方法(和參數(shù)),以及事件。
作為最新的數(shù)據(jù)庫訪問模式,ADO的使用也是簡單易用,所以微軟已經(jīng)明確表示今后把重點放在ADO上,對DAO/RDO不再作升級,所以ADO已經(jīng)成為了當前數(shù)據(jù)庫開發(fā)的主流。
ADO涉及的數(shù)據(jù)存儲有DSN(數(shù)據(jù)源名稱)、ODBC(開放式數(shù)據(jù)連接)以及OLE DB三種方式。后面的例程將詳細講解這三種方式的具體訪問實現(xiàn)。
要使用ADO,必須清楚ADO的對象層次結(jié)構(gòu),其大體上分為以下7個對象層次:
1、 Command 對象:包含關(guān)于某個命令,例如查詢字符串、參數(shù)定義等的信息。Command 對象在功能上和 RDO的rdoQuery 對象相似。
2、 Connection 對象:包含關(guān)于某個數(shù)據(jù)提供程序的信息。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,并且包含了關(guān)于結(jié)構(gòu)描述的信息。它還包含某些 RDOEnvironment 對象的功能,例如transaction 控件。
3、 Error對象:包含數(shù)據(jù)提供程序出錯時的擴展信息。Error 對象在功能上和 RDO 的rdoError 對象相似。
4、 Field 對象:包含記錄集中數(shù)據(jù)的某單個列的信息。Field 對象在功能上和 RDO的rdoColumn 對象相似。
5、 Parameter 對象:包含參數(shù)化的Command對象的某單個參數(shù)的信息。該 Command對象有一個包含其所有Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象相似。
6、 Property對象:包含某個 ADO 對象的提供程序定義的特征。沒有任何等同于該對象的RDO,但DAO有一個相似的對象。
7、Recordset對象:用來存儲數(shù)據(jù)操作返回的記錄集。此對象和Connection對象是所有對象最重要的兩個對象。
當然,對于初級用戶來說,我們只需要掌握其中的Connection對象和RecordSet對象就可以實現(xiàn)基本的數(shù)據(jù)庫操作,在后面的經(jīng)驗介紹里面我將給出詳細的介紹。
二. 開發(fā)經(jīng)驗小結(jié):
前面總體上介紹了一下當前在VB平臺下的數(shù)據(jù)庫訪問技術(shù),這些技術(shù)也是當前數(shù)據(jù)庫技術(shù)的主流。下面筆者結(jié)合近幾年的開發(fā)經(jīng)驗,給出一些開發(fā)經(jīng)驗和小技巧,以供參考:
經(jīng)驗一:如果數(shù)據(jù)量不大,而且要求開發(fā)周期短的情況,建議使用DAO+Access雖然DAO功能并不強大,但是其對Jet引擎進行了加速優(yōu)化處理,所以這種搭配應(yīng)該是比較好的選擇。
經(jīng)驗二:RDO當前已經(jīng)用的很少了,一般用ADO來替代。
經(jīng)驗三:(本經(jīng)驗很重要)使用ADO開發(fā)時,連接數(shù)據(jù)庫的方式有三種(前面已經(jīng)敘述了),其中DSN需要用戶首先使用要將所要操縱的數(shù)據(jù)庫設(shè)置為數(shù)據(jù)庫源并給其命名。方法是在控制面板->管理工具->數(shù)據(jù)源(ODBC)下面進行配置。比如設(shè)置的數(shù)據(jù)源名稱為data,那么可以通過下面幾行代碼來連接數(shù)據(jù)庫:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'連接數(shù)據(jù)庫
conn.Open "dsn=data"
'打開數(shù)據(jù)源(即選定操作的數(shù)據(jù)對象)
rs.Open SQL語句, conn
但是如果是使用ODBC和OLEDB的方式進行連接,那么大家一定知道在連接字符串上那一長串的代碼,不要說對于初學者,就是對于那些經(jīng)驗豐富的程序員來說,也很難記住這一串代碼。那么如何可以記住這一串代碼呢?其實,方法很簡單,只要添加一個ADO Data控件,然后在其屬性框中使用向?qū)нM行設(shè)置后,那么最后向?qū)Ь蜁詣由梢欢蜟onnectionString,只需要將這一行代碼拷貝下來然后放到conn.open之后的連接字符串參數(shù)的位置上就可以了。這條經(jīng)驗希望讀者能夠記住,實際開發(fā)中很實用。
經(jīng)驗四:前面講到手動設(shè)置ODBC數(shù)據(jù)源,這里也可以通過程序來進行動態(tài)設(shè)置。首先要清楚的是ODBC的詳細信息全部存放在注冊表的下述鍵值內(nèi):"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC",通過調(diào)用Win32函數(shù)WriteProfileString來對相應(yīng)的鍵值進行修改即可達到目的。
經(jīng)驗五:通常將數(shù)據(jù)庫的連接代碼和資源釋放代碼放入各自特定的函數(shù)里面,因為一般大一點的程序里需要經(jīng)常對這兩個功能模塊進行調(diào)用,這樣做就可以提高效率,當然很多時候都需要寫成連接池的形式。
經(jīng)驗六:使用VB在SQL中處理含單引號的字符串時,對字符串數(shù)據(jù)都用單引號引起來,如:
Select * from MyTable Where ID='FirstID'
若其中的FirstID為First'ID,即中間多出一個單引號,則上述寫法將導致錯誤,解決的辦法是將字符串中的每一個單引號用兩雙引號替換,下面的函數(shù)StrToSQL完成該功能,并用單引號將處理后的字符串引起來:
Private Function StrToSQL(ByVal strvalue As String) As String
StrToSQL = "'" + Replace(strvalue, "'", "''") + "'"
End Function
在寫SQL時如有字符串數(shù)據(jù),不管其中有沒有單引號,都可以這樣使用:
strvalue="First'Id"
strSQL="Select * from MyTable Where ID="+StrToSQL(strvalue)
三. 實例解析
下面介紹一個實例,來消化以上的相關(guān)知識。這里我在一個程序界面下實現(xiàn)了DAO,ADO,ODBC,OLEDB四種數(shù)據(jù)庫訪問方式。
程序代碼分析:
'整個程序功能是選擇不同的連接方式來進行顯示工作,三種方式顯示效果完全相同
'下面是主程序過程
Private Sub Command1_Click()
Dim selitem As Integer
'判斷連接數(shù)據(jù)庫的方式
If Option1.value = True Then
selitem = 1
Else
If Option2.value = True Then
selitem = 2
Else
selitem = 3
End If
End If
'選取不同的數(shù)據(jù)庫連接方式
Select Case selitem
Case 1:
'使用DAO的數(shù)據(jù)庫連接方式
Call ShowByDAO
Case 2:
'使用ADO的數(shù)據(jù)庫連接方式
Call ShowByADO
Case 3:
'使用ODBC的數(shù)據(jù)庫連接方式
Call ShowByODBC
Case 4:
'使用OLEDB的數(shù)據(jù)庫連接方式
Call ShowByOLEDB
End Select
End Sub
Private Sub ShowByDAO()
'使用DAO的數(shù)據(jù)庫連接方式
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)
'顯示結(jié)果
Call GridShow(rs)
End Sub
Sub ShowByADO()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'使用數(shù)據(jù)源來連接數(shù)據(jù)庫
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
'使用數(shù)據(jù)源來連接數(shù)據(jù)庫
conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=data"
rs.Open "select * from 成績表", conn
'顯示結(jié)果
Call GridShowOfADO(rs)
End Sub
Sub ShowByOLEDB()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'使用數(shù)據(jù)源來連接數(shù)據(jù)庫
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path & "\db1.mdb" + ";Persist Security Info=False"
rs.Open "select * from 成績表", conn
'顯示結(jié)果
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) = "數(shù)學"
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) = "數(shù)學"
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
上述代碼已經(jīng)在Windows 2000 professional和Visual Basic 6.0的環(huán)境下調(diào)試成功。
四.小結(jié)
本文通過對數(shù)據(jù)庫訪問相關(guān)技術(shù)的分析與總結(jié),提出若干有價值的經(jīng)驗。借鑒這些經(jīng)驗,會給開發(fā)帶來一定的便利。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。