引言
作為微軟旗下一款優秀的RAD工具,VB在數據庫應用開發方面的能力十分強大。微軟設計了多種數據庫訪問方法,下面通過對VB訪問數據庫的多種技術進行深入剖析,并總結出實際開發中的幾點經驗。希望能夠對那VB的初學者有所幫助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的環境下進行的)
一. DAO、RDO、ODBC和ADO
在VB的開發環境中,可以使用三種數據庫訪問方式,它們分別是:數據訪問對象(DAO)、遠程數據對象(RDO)和ADO對象模型。
DAO:
數據訪問對象是用來顯露了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利用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的環境下調試成功。
四.小結
本文通過對數據庫訪問相關技術的分析與總結,提出若干有價值的經驗。借鑒這些經驗,會給開發帶來一定的便利。