VisualC++數據庫連接論文

時間:2022-03-20 02:12:00

導語:VisualC++數據庫連接論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

VisualC++數據庫連接論文

一、開放數據庫連接

ODBC(OpenDataBaseConnectivity,開放數據庫連接)是微軟開放服務結構中有關數據庫的一個組成部分。它建立了一組規范,并提供了一組應用程序調用接口。用這樣一組接口建立的應用程序,對數據庫的操作不依賴于任何數據庫管理系統,不直接與任何DBMS打交道,由此可實現應用程序對不同DBMS的共享論文。數據庫操作的“數據源”對應用程序是透明的,所有的數據庫操作由對應DBMS的ODBC驅動程序(ODBCDriver)完成。有了ODBC驅動程序,數據源就變得十分廣泛,它可以是本機的某種數據庫格式的文件(如本機DOS目錄下的Access文

件*.mdb),也可以是遠程數據庫文件(如MicrosoftSQLServer);它可以是已知的某種DBMS格式,也可以是一種全新的數據庫格式??傊?它取決于提供了什么數據庫類型的驅動程序。

visualc++中的ODBC主要是實現基于Windows的關系數據庫的應用的共享。

二、ODBC管理器

在ODBC中,數據源是一個重要的概念,它是數據庫位置和數據庫類型等連接信息的總和。數據源在使用前必須通過ODBC管理器(Administrator)進行登錄。在登錄數據源時,要搞清數據源名(Datasourcename)、數據庫文件名(Databasename)和數據表格名(Tablename)這三者的概念和相互關系:數據源實際是一種數據連接的抽象,數據源名是登錄時賦予的“連接”的名稱,以供應用程序使用,至于該數據源下連接的是哪一個數據庫,則由數據庫文件名指出(如Access2.0forMSOffics中的.mdb文件);一個數據庫文件中可以包括若干個數據表格(table)和其他。在關系@@09A05900.GIF;圖1ODBC層次關系圖數據庫中,數據是以二維表格的方式存在于數據庫@@文件中,應用程序最終的操作目標即是這些表格中的行(row記錄)和列(columns字段)數據。對于foxprow數據源,數據庫文件名是“路徑名”,而該路徑下的所有數據文件(*.dbf)都屬于該“數據庫文件”名下的數據表格(table)。

ODBC管理器被裝在ControlPanel里(ODBCINST.CPL)。通過該工具可以增添、修改或刪除數據源,也用來增添、刪除ODBC驅動程序,ODBC管理器把數據源和它們的連接信息保存在ODBC.INI、ODBCINST.INI和ODBCISAM.INI中。當需要共享應用程序時,只需按新的數據文件的類型和位置重新登錄即可。

三、ODBC應用程序接口

ODBCAPI是一組標準的ODBC函數庫,除了一般的數據庫操作函數外,還包括一組函數(如SQLExec或SQLExecdirect)能夠內嵌標準SQL查詢語句。SQL(StructuredQueryLanguage結構化查詢語言)是一種存取關系型數據庫的標準語言,能夠定義、查詢、修改和控制數據,簡單的語句能夠作用于整個數據表格,具有很強的功能。

同Windows3.1SDK中API類似,ODBCAPI也是基于句柄(handle)進行操作的。API函數按功能可分為以下幾類:

·數據源連接函數,設置/獲取有關信息的函數;

·準備/提交執行SQL查詢語句的函數和獲得數據的函數;

·終止函數和異常處理函數。

上述函數的順序也表示了進行數據庫操作的一般順序。兩個需要特別說明,一是數據類型問題:數據源中的數據所具有的數據類型稱為SQL數據類型,這些數據類型在其數據源中可能比較特殊,不一定和ODBCSQL數據類型存儲方式一致,驅動程序把這些數據類型同ODBCSQL數據類型進行相互轉換,每一個ODBCSQL數據類型都相當于一個ODBCC語言數據類型;二是函數的調用級別問題,并不是每一個ODBC驅動程序都支持所有的ODBCAPI函數調用,在應用程序中,可以調用有關函數獲取驅動程序以支持層次方面的信息。

四、ODBC編程

在VisualC++中,MFC(MicrosoftFoundationClass基本類庫)是經過對Windows應用程序中各個部件進行類的抽象而建立的一組預定義的類,如窗口基類(CWnd)、各種窗口派生類等等,這些類在應用程序中可直接使用,不需要重新定義。在MFC中,也為ODBC預定義了幾個類,其中主要的是數據庫類(CDatabase)和記錄集合類(CRecoredset)。這兩個類既有聯系又有區別,在應用程序中,可以分別使用,也可以同時使用,每一類也可以同時存在多個對象。CDatabase的每一個對象代表了一個數據源的連接,CRecordset的每一個對象代表了從一

個數據表中按預定的查詢條件獲得的記錄的集合,一般說來,前者適宜于對數據源下的某個數據表格進行整體操作,后者用于對所選的記錄集合進行處理。

同Windows類與SDKAPI函數的關系一樣,CDatabase類與ODBCAPI函數也有類似的關系,但CDatabase類中并不包含所有的ODBCAPI函數,大部分操作功能仍須直接調用ODBCAPI函數,如目錄功能函數,用于獲得數據源下的數據表格信息,如表格名,字段名等。

在應用編程時,一般使用CDatabase和CRecordset的派生類。假設派生類分別為CUserdb和CUserset,而在應用類CUserClass中,使用了一個CUserdb對象(m-db)和一個Cuserset對象(m-recset),圖2給出了用戶應用類與ODBC類的相互關系示意圖。

@@09A05901.GIF;圖2CDatabaseCRecordset類與應用類及數據源關系圖@@

1.m-db連接數據源

m-db在完成定義構造后,要調用CDatabase的打開(Open)函數以進行數據源的實際連接:

m-db.Open(lpszDSN,bExclusive,bReadOnly,lpszConnect);

打開函數需要輸入四個參數。lpszDSN:要連接的數據源的名字,如果lpszDSN=NULL且lpszConnect中也沒有指明數據源名,則該調用會自動出現一個對話框列出所有可用的數據源(名),讓用戶選擇。bExclusive:只支持“假”(False)值,表示為共享(share)方式連接。因此,應用程序在運行前,一定要裝入share.exe或在Windows的system.ini中裝入vshare.386。ReadOnly:指明數據源操作方式是“只讀”還是可以修改。lpszConnect:指明連接字符串,包括數據源名、用戶標識碼、口令等信息。該字符串必須以“ODBC;”開頭,表示該連接是與一個ODBC數據源的連接(考慮以后版本支持非ODBC數據源)。

m-db打開后,其指針可以傳給m-recset作為其數據源。m-db關閉后,將關閉所有CRecordset對它的連接,m-db也可以重新打開。

2.m-db操作數據

數據源打開后,即可對數據庫文件中的數據表格進行操作,操作以調用SQL語句方式進行,可直接通過ODBCAPI函數,或者CDatabase類成員函數ExecuteSQL。數據表名在SQL語句中指定,如下語句則在所在的數據源中的clerk表中插入一個記錄,記錄的name字段值為"chen"。

m-db.ExecuteSQL("insertintoclerk(name)value(''''chen'''')");3.m-recset連接數據m-recset在構造時,可傳入一個CDatabase對象指針,作為m-recset的數據源,當為NULL時,必須重載CRecordset的函數GetDefaultConnect,以提供數據源連接字符串(相當于m-db.Open中的lpszConnect)。如下則表示連接名為COMPANY的數據源(當傳入了合法的CDatabase對象指針時,該函數將不被調用)。

CStringCUserset::GetDefaultConnect()

{

return"ODBC;DSN=COMPANY;";

}4.m-recset選取記錄和字段

m-recset在調用打開函數時,即獲得了符合條件的一組記錄,條件語句在Open函數中的lpszSQL中給出,如果lpszSQL為NULL,則必須重載CRecordset的函數以提供該語句。該語句是一個SELECT語句,帶或不帶where和orderby子句(如果不帶,where和Orderby的條件也可在CRecordset的兩個預定義成員變量m-strFilter和m-strSort中給出)。lpszSQL也可以只是一個數據表名(table-name),也可以是對內嵌在數據庫文件中的查詢程序的調用語句。所選擇的一系列字段名,在成員函數DoFieldExchange中由一系列RFX-函數指定。RFX-(RecordFieldExchange)函數,使字段和成員變量一一建立類型對應關系。另外,m-strFilter中也可以帶變量參數(用"?"表示,如"fieldl>=?ANDfield2<=?"),參數與成員變量的對應關系也在DoFieldExchange中由RFX-函數指定(串中的"?"將被參數變量值逐一替換)。

voidCUserset::DoFieldExchange(CFieldExchange*pFX)

{

pFX->SetFieldType(CFieldExchange::outputColumn);

/*以下為字段連接*/

RFX-???(pFX,"field1",m-var1);

RFX-???(pFX,"field2",m-var2);

...

RFX-???(pFX,"fieldn",m-varn);

pFX->SetFieldType(CFieldExchange::param);

/*以下為參數連接*/

RFX-???(pFX,field1,m-param1);

RFX-???(pFX,field2,m-param2);

...

}其中,???為ODBCSQL數據類型名,如RFX-Double,RFX-Text等。

綜合上述,選取記錄和字段實際是由下列語句完成:

SELECTrfx-field-listFROMtable-name[WHEREm-strFilter][ORDERBYm-strSort]

字段變量和參數變量的個數一定要在調用打開函數前(如構造函數中)準確地賦值給成員變量m-nFields和m-nParams。m-recset在打開后的任何時候調用Requery()函數,將根據新的查詢條件(例如修改了參數變量值)重新選取記錄。

5.m-recset操作數據

記錄集合生成后,其當前記錄的各字段值被保存在前述的各字段變量中,如果調用CRecordset的滾動(scroll)函數,如MoveFirst(),MoveNext(),MovePrev(),MoveLast()等,字段變量的值將自動跟隨“當前”記錄的位置的變化而變化。IsBOF(),IsEOF()用于判別是否移動到記錄的頭或尾。

數據操作主要包括刪除(Delete),添加(AddNew)和更改(Edit),一般流程為:

if(m-recset.CanUpdate())/*是否允許修改*/

{

if(m-db.CanTransact())/*是否支持“批”處理*/

{

m-db.BeginTrans();

m-recset.AddNew();

/*修改字段變量值*/

...

m-recset.Update();

m-mitTrans();

if(catcherror)

m-db.RollBack();

}

}

對于AddNew和Edit,修改字段變量后一定要調用函數Update(),否則更新將丟失,而Delete操作則不必進行字段值修改和調用Update()。

上述的CDatabase的四個函數是ODBC為保證數據操作的可靠性而提供的“批”處理函數,即在BeginTrans和CommitTrans之間的數據修改如果出現任何異常,可通過函數RoolBack來恢復所做的修改。

在多用戶系統使用時,每一個數據源可以被多個用戶的多個任務連接,不同的任務可同時修改相同的數據源。ODBC提供了兩種數據表更新的同步機制(在m-recset.Open函數中指定),“靜態”的(snapshot)和動態的(dynaset)。前者是一組靜態的記錄集合,當建立后不會改變,除了反應自己的添加/刪除外,不反應別的用戶的修改,除非調用了Requery重新建立。后者是一組動態的記錄集合,自己或別的用戶所作的修改隨時反應到集合中來(當然也可用Requery重建),以保持記錄與數據源的同步。在應用中,應根據需要確定使用哪一種方式。

五、結束語

從以上討論可以看出,ODBC應用接口十分簡便!再加上VisualC++中的AppWizard和ClassWizard自動生成框架代碼功能,連接一個數據源,生成一個CRecordset對象,就更快捷了。

應用程序只需關心數據的處理而不必費心數據的存取,另外,另一個與ODBC有關的類CRecordView,是一個窗口類CWnd的派生類,建立在CRecordset上,可直接構造數據庫記錄顯示窗口,某些情況下也不妨一用。