摘 要 本文介紹了ODBC的運(yùn)行機(jī)制,著重討論了VisualC++1.5下應(yīng)用MFC進(jìn)行ODBC編程的方法。
關(guān)鍵詞 ODBC 連接 MFC
中圖分類號(hào): TP312 文獻(xiàn)標(biāo)識(shí)碼:A
1 開放數(shù)據(jù)庫連接
ODBC(OpenDataBaseConnectivity,開放數(shù)據(jù)庫連接)是微軟開放服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫的一個(gè)組成部分。它建立了一組規(guī)范,并提供了一組應(yīng)用程序調(diào)用接口。用這樣一組接口建立的應(yīng)用程序,對(duì)數(shù)據(jù)庫的操作不依賴于任何數(shù)據(jù)庫管理系統(tǒng),不直接與任何DBMS打交道,由此可實(shí)現(xiàn)應(yīng)用程序?qū)Σ煌珼BMS的共享。數(shù)據(jù)庫操作的“數(shù)據(jù)源”對(duì)應(yīng)用程序是透明的,所有的數(shù)據(jù)庫操作由對(duì)應(yīng)DBMS的ODBC驅(qū)動(dòng)程序(ODBCDriver)完成。
2 ODBC管理器
在ODBC中,數(shù)據(jù)源是一個(gè)重要的概念,它是數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等連接信息的總和。數(shù)據(jù)源在使用前必須通過ODBC管理器(Administrator)進(jìn)行登錄。在登錄數(shù)據(jù)源時(shí),要搞清數(shù)據(jù)源名(Datasourcename)、數(shù)據(jù)庫文件名(Databasename)和數(shù)據(jù)表格名(Tablename)這三者的概念和相互關(guān)系:數(shù)據(jù)源實(shí)際是一種數(shù)據(jù)連接的抽象,數(shù)據(jù)源名是登錄時(shí)賦予的“連接”的名稱,以供應(yīng)用程序使用,至于該數(shù)據(jù)源下連接的是哪一個(gè)數(shù)據(jù)庫,則由數(shù)據(jù)庫文件名指出(如Access2.0forMSOffics中的.mdb文件);一個(gè)數(shù)據(jù)庫文件中可以包括若干個(gè)數(shù)據(jù)表格(table)和其他內(nèi)容。在關(guān)系文件中,應(yīng)用程序最終的操作目標(biāo)即是這些表格中的行(row記錄)和列(columns字段)數(shù)據(jù)。對(duì)于foxprow數(shù)據(jù)源,數(shù)據(jù)庫文件名是“路徑名”,而該路徑下的所有數(shù)據(jù)文件(*.dbf)都屬于該“數(shù)據(jù)庫文件”名下的數(shù)據(jù)表格(table)。
3 ODBC應(yīng)用編程
在VisualC++中,MFC(MicrosoftFoundationClass基本類庫)是經(jīng)過對(duì)Windows應(yīng)用程序中各個(gè)部件進(jìn)行類的抽象而建立的一組預(yù)定義的類,如窗口基類(CWnd)、各種窗口派生類等等,這些類在應(yīng)用程序中可直接使用,不需要重新定義。在MFC中,也為ODBC預(yù)定義了幾個(gè)類,其中主要的是數(shù)據(jù)庫類(CDatabase)和記錄集合類(CRecoredset)。這兩個(gè)類既有聯(lián)系又有區(qū)別,在應(yīng)用程序中,可以分別使用,也可以同時(shí)使用,每一類也可以同時(shí)存在多個(gè)對(duì)象。CDatabase的每一個(gè)對(duì)象代表了一個(gè)數(shù)據(jù)源的連接,CRecordset的每一個(gè)對(duì)象代表了從一個(gè)數(shù)據(jù)表中按預(yù)定的查詢條件獲得的記錄的集合,一般說來,前者適宜于對(duì)數(shù)據(jù)源下的某個(gè)數(shù)據(jù)表格進(jìn)行整體操作,后者用于對(duì)所選的記錄集合進(jìn)行處理。
在應(yīng)用編程時(shí),一般使用CDatabase和CRecordset的派生類。假設(shè)派生類分別為CUserdb和CUserset,而在應(yīng)用類CUserClass中,使用了一個(gè)CUserdb對(duì)象(m-db)和一個(gè)Cuserset對(duì)象(m-recset)。
3.1 m-db連接數(shù)據(jù)源
m-db在完成定義構(gòu)造后,要調(diào)用CDatabase的打開(Open)函數(shù)以進(jìn)行數(shù)據(jù)源的實(shí)際連接:
m-db.Open(lpszDSN,bExclusive,bReadOnly,lpszConnect);
打開函數(shù)需要輸入四個(gè)參數(shù)。lpszDSN:要連接的數(shù)據(jù)源的名字,如果lpszDSN=NULL且lpszConnect中也沒有指明數(shù)據(jù)源名,則該調(diào)用會(huì)自動(dòng)出現(xiàn)一個(gè)對(duì)話框列出所有可用的數(shù)據(jù)源(名),讓用戶選擇。bExclusive:只支持“假”(False)值,表示為共享(share)方式連接。因此,應(yīng)用程序在運(yùn)行前,一定要裝入share.exe或在Windows的system.ini中裝入vshare.386。ReadOnly:指明數(shù)據(jù)源操作方式是“只讀”還是可以修改。lpszConnect:指明連接字符串,包括數(shù)據(jù)源名、用戶標(biāo)識(shí)碼、口令等信息。該字符串必須以“ODBC;”開頭,表示該連接是與一個(gè)ODBC數(shù)據(jù)源的連接(考慮以后版本支持非ODBC數(shù)據(jù)源)。
3.2 m-db操作數(shù)據(jù)
數(shù)據(jù)源打開后,即可對(duì)數(shù)據(jù)庫文件中的數(shù)據(jù)表格進(jìn)行操作,操作以調(diào)用SQL語句方式進(jìn)行,可直接通過ODBCAPI函數(shù),或者CDatabase類成員函數(shù)ExecuteSQL。數(shù)據(jù)表名在SQL語句中指定,如下語句則在所在的數(shù)據(jù)源中的clerk表中插入一個(gè)記錄,記錄的name字段值為\"chen\"。
m-db.ExecuteSQL(\"insertintoclerk(name)value(’chen’)\");3.m-recset連接數(shù)據(jù)m-recset在構(gòu)造時(shí),可傳入一個(gè)CDatabase對(duì)象指針,作為m-recset的數(shù)據(jù)源,當(dāng)為NULL時(shí),必須重載CRecordset的函數(shù)GetDefaultConnect,以提供數(shù)據(jù)源連接字符串(相當(dāng)于m-db.Open中的lpszConnect)。如下則表示連接名為COMPANY的數(shù)據(jù)源(當(dāng)傳入了合法的CDatabase對(duì)象指針時(shí),該函數(shù)將不被調(diào)用)。
參考文獻(xiàn)
[1] 張韓雙.Visual C++中實(shí)現(xiàn)數(shù)據(jù)庫連接[J].科技信息(科學(xué)教研).2012(24).
[2] 飛思科技產(chǎn)品研發(fā)中心.Java靈感編程[M].北京:電子工業(yè)出版社,2002.
[3] 張洪斌.Java程序設(shè)計(jì)百事通[M].北京:清華大學(xué)出版社,2001.