王素芳
(廣東白云學(xué)院 電氣與信息工程學(xué)院,廣東 廣州 510430)
自Visual Basic 3.0開始,Visual Basic就具有數(shù)據(jù)庫連接和數(shù)據(jù)處理功能。在Visual Basic 6.0版中,數(shù)據(jù)庫功能得到了空前的增強。Microsoft公司把許多新的數(shù)據(jù)訪問功能加到Visual Basic中,使得該產(chǎn)品成為數(shù)據(jù)庫應(yīng)用程序開發(fā)的理想平臺。Visual Basic提供了眾多功能各異的數(shù)據(jù)控件,利用這些控件,用戶只要編寫少量代碼甚至不編寫任何代碼就可以訪問數(shù)據(jù)庫,對數(shù)據(jù)庫進行瀏覽及其他操作。Visual Basic還提供了幾種不同的數(shù)據(jù)庫對象模型,以實現(xiàn)對面向不同應(yīng)用的數(shù)據(jù)庫的全面處理,利用這些模型中的一種或者幾種,可以對幾乎所有種類的數(shù)據(jù)庫進行操作。
VB中將數(shù)據(jù)庫分為了3種類型:
(1)本地數(shù)據(jù)庫:主要指Microsoft Access數(shù)據(jù)庫。
(2)外部數(shù)據(jù)庫:是指采用 ISAM (Indexed Sequential Access Method,索引順序訪問方法)的數(shù)據(jù)庫,比如 dBase、Foxpro、Paradox 和Excel等。
(3)遠程數(shù)據(jù)庫:指 SQL Server、Oracle、DB2 等大型數(shù)據(jù)庫,當(dāng)前的大型數(shù)據(jù)庫應(yīng)用程序基本上都是以這類數(shù)據(jù)庫為后臺。
VB可通過不同的方式與目前較為流行的大多數(shù)數(shù)據(jù)庫進行連接。
傳統(tǒng)的連接方法主要有JET數(shù)據(jù)庫引擎 (JET)、Microsoft ODBC(Open Database Connectivity,開放式數(shù)據(jù)庫連接)驅(qū)動程序、OLE DB。
(1)Jet引擎:聯(lián)合數(shù)據(jù)庫引擎,是Microsoft公司開發(fā)的用于本地數(shù)據(jù)庫(比如 Access)、外部數(shù)據(jù)庫(比如 dBase、Excel、Paradox)的數(shù)據(jù)庫引擎。它也可以訪問遠程數(shù)據(jù)庫(比如SQL Server、Oracle),但必須通過ODBC來轉(zhuǎn)接。
(2)ODBC:開放式數(shù)據(jù)庫連接,是一種建立數(shù)據(jù)庫驅(qū)動程序的標準,當(dāng)前幾乎所有的DBMS都支持這種數(shù)據(jù)庫引擎。ODBC是在數(shù)據(jù)庫和應(yīng)用程序之間提供的一個抽象層,即通過驅(qū)動程序和游標庫來和數(shù)據(jù)庫進行通信。這樣,通過ODBC就可以使用本地化的協(xié)議來訪問所有支持ODBC的數(shù)據(jù)庫了。
(3)OLE DB:微軟公司于1996年提出了一種新的數(shù)據(jù)庫訪問策略UDA (Universal Data Access),它的核心是一系列組件對象模型(COM)接口,被命名為OLE DB。這些接口允許開發(fā)人員創(chuàng)建數(shù)據(jù)庫提供者(Data Providers)。數(shù)據(jù)提供者能夠很靈活地表達各種格式存儲的數(shù)據(jù),通用性比ODBC更好、更靈活。
VB集成開發(fā)環(huán)境提供的數(shù)據(jù)庫訪問技術(shù)主要有DAO、ODBC API、RDO和ADO等。目前的主流技術(shù)是ADO技術(shù)。
(1)DAO
數(shù)據(jù)訪問對象 (Data Access Object)DAO方式是允許程序員操作Microsoft Jet數(shù)據(jù)庫引擎的第一個面向?qū)ο蟮慕涌凇et數(shù)據(jù)庫引擎是一種用來訪問Microsoft Access和其它數(shù)據(jù)源的記錄和字段的技術(shù)。DAO訪問SQL Server數(shù)據(jù)庫有兩種不同的對象模型可供選擇:一種對象模型是通過Jet引擎來訪問數(shù)據(jù);另一種是通過ODBC Direct來訪問數(shù)據(jù)。這兩種對象模型都是層次結(jié)構(gòu)的。使用DAO的程序編碼非常簡單,其模型是設(shè)計關(guān)系數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)的對象類的集合,它們提供了完成管理這樣一個系統(tǒng)所需的全部操作的屬性和方法。
(2)ODBC API
用ODBC API編程開放數(shù)據(jù)庫連接ODBC(Open Database Connectivity)的思想是訪問異種數(shù)據(jù)庫的一種可移植的方式。ODBC API是一套復(fù)雜的函數(shù)集,可提供一些通用的接口,以便訪問各種后臺數(shù)據(jù)庫,與數(shù)據(jù)資源對話的公用函數(shù)組裝在一個稱為驅(qū)動程序管理器(ODBC.DLL)的動態(tài)連接庫中。應(yīng)用程序調(diào)用驅(qū)動程序管理器中的函數(shù),而驅(qū)動程序管理器通過驅(qū)動器(SQL Server.DLL)把它們送到服務(wù)器中。
(3)RDO
遠程數(shù)據(jù)對象(Remote Data Object)RDO方式是提供給開放數(shù)據(jù)庫互連(ODBC)數(shù)據(jù)源的面向?qū)ο蟮慕涌?。RDO是位于ODBC API之上的一個對象模型層,它依賴ODBC API、ODBC驅(qū)動程序以及后端數(shù)據(jù)庫引擎來實現(xiàn),用RDO所編的程序短小、快速。RDO是開發(fā)Microsoft SQL Server,Oracle和其它大型關(guān)系數(shù)據(jù)庫應(yīng)用程序的絕大多數(shù)數(shù)據(jù)庫開發(fā)者使用的對象模型。與DAO相比,RDO提供了前所未有的連接和查詢速度,但它對SQL Server和Oracle以外的數(shù)據(jù)庫的存取性能沒有保證,微軟已經(jīng)推薦使用ADO替換RDO。
(4)ADO
為了克服DAO和RDO的缺點,提供一種統(tǒng)一的數(shù)據(jù)庫訪問技術(shù),Microsoft提出了ADO技術(shù)。ADO是應(yīng)用層的編程接口,它封裝并實現(xiàn)了OLE DB(Object Linked and Embed Database,對象鏈接與嵌入式數(shù)據(jù)庫)的所有功能,在繼承OLE DB的同時,大大簡化了OLE DB的操作。它通過OLE DB提供的COM接口訪問數(shù)據(jù),可訪問各種類型的數(shù)據(jù)源,既適合于SQL Server、Oracle、Access等數(shù)據(jù)庫應(yīng)用程序,也適合于Excel表格、文本文件、圖形文件和無格式的數(shù)據(jù)文件。ADO主要采用OLE DB訪問數(shù)據(jù)庫,也支持ODBC訪問,但需要經(jīng)過OLE DB轉(zhuǎn)接。
ADO是Microsoft公司提出的第三種數(shù)據(jù)庫訪問對象,是Microsoft數(shù)據(jù)庫訪問技術(shù)的一個主要發(fā)展方向,它把OLE DB封裝在一個數(shù)據(jù)對象中,使得VB程序可以方便地實現(xiàn)對數(shù)據(jù)庫的訪問。
ADO與其他對象模型的主要區(qū)別在于它的簡單和非層次結(jié)構(gòu)。這種對象模型共包含7個對象,即Connection、Command、Recordset、Parameter、Property、Field 和 Error。其中最常用的是Connection、Command、Recordset和Field 4個對象。它們的具體功能是:
(1)Command對象:包含關(guān)于某個命令(如查詢字符串,參數(shù)定義等)信息。
(2)Connection對象:包含某個數(shù)據(jù)提供程序的信息。
(3)Error對象:包含數(shù)據(jù)提供程序出錯時的擴展信息。
(4)Property對象:包含某個ADO對象的提供程序定義的特征。
(5)Parameter對象:包含參數(shù)化的Command對象的某單個參數(shù)的信息,該Command對象有一個包含其所有Parameter對象Parameters集合。
(6)Recordset對象:包含某個查詢返回的記錄,以及記錄中的游標。Recordset對象只代表一個記錄集,這個記錄集是一個連接的數(shù)據(jù)庫中的表,或者是Command對象的執(zhí)行結(jié)果返回的記錄集。在ADO對象模型中,在行中檢查和修改數(shù)據(jù)是最主要的方法,所有對數(shù)據(jù)的操作幾乎都是在Recordset對象中完成的。Record對象用于指定行、移動行、添加、更改、刪除記錄。
(7)Field對象。包含記錄集中數(shù)據(jù)的某單個列的信息。
使用ADO技術(shù)訪問數(shù)據(jù)庫有三種方法∶使用ADO數(shù)據(jù)控件、使用ADO對象、通過SQL語句訪問數(shù)據(jù)庫。使用ADO數(shù)據(jù)控件可以使用戶很方便地不用編程或編寫很少的代碼就可以訪問數(shù)據(jù)庫數(shù)據(jù)。使用ADO對象可以實現(xiàn)更復(fù)雜、更靈活的數(shù)據(jù)訪問。由于ADO不具有顯示數(shù)據(jù)的功能,因此要將數(shù)據(jù)操作結(jié)果在用戶界面上顯示出來,就要靠數(shù)據(jù)綁定控件來實現(xiàn)。
2.2.1 ADO數(shù)據(jù)控件
ADO數(shù)據(jù)控件支持OLE DB數(shù)據(jù)訪問模型,既可以訪問Oracle、SQL Server等大型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),也可以訪問Access、FoxPro等小型桌面數(shù)據(jù)庫管理系統(tǒng),還可以訪問文本數(shù)據(jù)、郵件數(shù)據(jù)、圖形數(shù)據(jù)等。因此說,使用ADO數(shù)據(jù)控件幾乎可以訪問各種類型的數(shù)據(jù)源。ADO數(shù)據(jù)控件的名稱為“Adodc”,它是一個ActiveX控件,必須手工添加到工具箱中才能使用。在“部件”對話框的“控件”選項卡中選中“Microsoft ADO Data Control 6.0(OLE DB)”復(fù)選框即可添加Adodc控件到工具箱。ADO數(shù)據(jù)控件的主要屬性有∶
1)ConnectionString 屬性
ConnectionString屬性用于建立到數(shù)據(jù)源的連接,它指定連接到數(shù)據(jù)源的OLE DB數(shù)據(jù)訪問接口和具體的數(shù)據(jù)庫文件。不同的數(shù)據(jù)源要使用不同的OLE DB數(shù)據(jù)訪問接口,由ConnectionString屬性的Provider參數(shù)指定所用的OLE DB接口;由ConnectionString屬性的Data Source參數(shù)指定具體的數(shù)據(jù)庫文件;另外,還可以指定連接數(shù)據(jù)庫的用戶名和密碼等信息。下面給出連接到Access數(shù)據(jù)庫student.mdb實例∶
Adodc1.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& App.Path&"student.mdb;Persist Security Info=False"
2)CommandType 屬性
CommandType屬性指明命令的類型,即要訪問的數(shù)據(jù)的具體來源。這個屬性要和RecordSource屬性配合使用。
3)RecordSource 屬性
RecordSource屬性設(shè)置ADO記錄集的內(nèi)容,這個內(nèi)容可以來自數(shù)據(jù)庫中的一張表、一個查詢語句或者來自一個存儲過程的執(zhí)行結(jié)果。如果CommandType屬性的取值為adCmdTable,則RecordSource屬性的內(nèi)容是一個表名,ADO記錄集是對此表無條件查詢得到的結(jié)果;如果CommandType屬性的取值為adCmdText,則RecordSource屬性的內(nèi)容是一個查詢語句文本串,ADO記錄集是執(zhí)行此查詢語句文本產(chǎn)生的結(jié)果;如果CommandType屬性的取值為 adCmdStoredProc,則RecordSource屬性的內(nèi)容是一個存儲過程名,ADO記錄集執(zhí)行此存儲過程產(chǎn)生的結(jié)果;CommandType屬性的默認值為adCmdUnknown,表示RecordSource屬性中的命令類型未知。
4)Recordset屬性
Recordset屬性又稱為記錄集,它本身又是一個對象。VB應(yīng)用程序一般就是通過記錄集來操作數(shù)據(jù)庫的,所以記錄集是VB應(yīng)用程序和數(shù)據(jù)庫之間相互連接的橋梁。在訪問數(shù)據(jù)庫的時候,設(shè)置好ConnectionString屬性、CommandType屬性和Record-Source屬性后,執(zhí)行RecordSource屬性的結(jié)果就放在Recordset中。
ADO數(shù)據(jù)控件最重要的方法是Refresh。Refresh方法用于更新ADO數(shù)據(jù)控件屬性,使修改后的ADO數(shù)據(jù)控件屬性生效。所以當(dāng)改變了ADO數(shù)據(jù)控件屬性后就要執(zhí)行Refresh方法。
2.2.2 外部數(shù)據(jù)綁定控件
要將數(shù)據(jù)操作結(jié)果顯示出來要使用數(shù)據(jù)綁定控件。VB中的TextBox、CheckBox、ComboBox、ListBox等標準控件都是數(shù)據(jù)綁定控件,但是這些標準控件只能顯示記錄集中一個列的值。除了這些標準控件外,還有一些ActiveX控件也可以實現(xiàn)數(shù)據(jù)綁定功能,這些控件稱為外部數(shù)據(jù)綁定控件。常見的外部數(shù)據(jù)綁定控件有DataCombo、DataList、DataGrid、MSHFGrid、MSFlexGrid等,這些外部數(shù)據(jù)綁定控件提供了比標準控件更加強大的功能,比如有些控件能顯示記錄集的全部內(nèi)容。
以DataGrid控件為例來看外部數(shù)據(jù)綁定控件的用法。下面給出一個實例,這個例子使用ADO數(shù)據(jù)控件從student.mdb數(shù)據(jù)庫的student表中查詢所有sex="女"的記錄的學(xué)號和姓名,再使用外部數(shù)據(jù)綁定控件DataGrid把學(xué)號和姓名顯示出來∶
Private Sub Command1_Click()
Adodc1.Visible=False
DataGrid1.AllowAddNew=False
DataGrid1.AllowUpdate=False
DataGrid1.AllowDelete=False
DataGrid1.Caption="女生信息"
Adodc1.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& App.Path& "student.mdb;Persist Security Info=False"
Adodc1.CommandType=adCmdText
Adodc1.RecordSource="select xh,xm from student where sex="女"
Adodc1.Refresh
Set DataGrid1.DataSource=Adodc1
DataGrid1.Refresh
DataGrid1.Columns.Item(0).width=1200
DataGrid1.Columns.Item(1).width=1200
DataGrid1.Columns.Item(0).Caption="學(xué)號"
DataGrid1.Columns.Item(1).Caption="姓名"
End Sub
2.2.3 通過SQL語句訪問數(shù)據(jù)庫
在VB應(yīng)用程序中主要用這個對象建立與數(shù)據(jù)庫的連接,一般的方法是:
(1)聲明并創(chuàng)建對象
Dim ADOcn As Connection’聲明對象
Set ADOcn=New Connection’創(chuàng)建新對象,或?qū)⑸鲜鰞蓷l語句直接寫成:
Dim ADOcn As New Connection。
(2)建立數(shù)據(jù)庫連接
一般通過下列語句完成與數(shù)據(jù)庫(源)的連接:ADOcn.Open連接字符串。
(3)對數(shù)據(jù)表進行更新操作
可以利用Connection對象對數(shù)據(jù)庫中的基本表進行增加、刪除、修改等不返回結(jié)果集的操作,語法如下:ADOcn.Execute SQL語句。
VB的數(shù)據(jù)庫訪問技術(shù),歷經(jīng)了DAO、RDO、ADO等重要階段。ADO是DAO/RDO的后繼產(chǎn)物,盡管Visual Basic 6.0仍然支持DAO和RDO兩種數(shù)據(jù)訪問接口,但其核心與重點已經(jīng)轉(zhuǎn)移到ADO/OLEDB數(shù)據(jù)訪問技術(shù)上。ADO作為最新的數(shù)據(jù)庫訪問模式它具有功能強、通用性好、效率高、占空間少等特點。ADO數(shù)據(jù)控件易于掌握、代碼短小,但是程序靈活性較差,而ADO對象功能強大、靈活性好,在具體開發(fā)的時候要靈活運用這兩種方法。我們在實際開發(fā)中,對數(shù)據(jù)庫的操作更適合采用對象模型編程方式,以便更靈活地對數(shù)據(jù)庫進行操作。
[1]黃玉春.Visual Basic程序設(shè)計與實訓(xùn)教程[M].北京:清華大學(xué)出版社,2006.
[2]祝旭.VB訪問數(shù)據(jù)庫的三種技術(shù)[J].湖南工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報,2010(8)∶8-9.
[3]吳青林,王焱.VB中ADO訪問數(shù)據(jù)庫技術(shù)探討[J].軟件導(dǎo)刊,2010(2)∶151-152.
[4]陳英.Visual Basic程序設(shè)計教程[M].大連理工大學(xué)出版社,2007.
[5]李志偉.VB環(huán)境下基于ADO的Oracle數(shù)據(jù)庫訪問[J].電腦開發(fā)與應(yīng)用,2009(09)∶60-62.
[6][美]Grey perry.學(xué)用 Visualbaisc6.0[M].戴紅,陳吉吉,姚娜,譯.清華大學(xué)出版社.