VC6 ODBC 例子 之一

2021-09-08 07:30:03 字數 4459 閱讀 7016

在vc中,使用odbc連線是資料庫有兩種方法,第一種就是使用odbc api,第二種就是使用mfc odbc,在這裡我只談一下mfc

odbc。

為了使資料庫開發變得更方便,microsoft對odbc api進行的封裝,使得我們開發資料庫時可以直接使用mfc odbc類:

cdatabase:建立與資料來源的連線

crecordset:獲取記錄集

crecordview:提供乙個表單檢視與某個記錄集直接相連,利用對話方塊資料交換機制(ddx)在記錄集與表單檢視的空間之間傳輸資料

cfieldexchange:支援記錄字段資料交換(dfx),即記錄集字段資料成員與相應的資料庫的表的字段之間的資料交換

cdbexception:odbc的異常類

一、 在實際開發中,使用mfc odbc類訪問資料庫步驟如下:

a . 使用cdatabase類方法開啟資料來源:

定義cdatabase物件m_db;呼叫其openex方法開啟資料來源,openex原型如下:

virtual bool openex( lpctstr lpszconnectstring, dword dwoptions=0 );

引數一為連線字串:如"dns=memo;uid=sa;pwd=123",dns為資料來源名稱,注意到如果為lpszconnectstring傳遞null,則將

出現資料來源對話方塊,提示使用者選擇乙個資料來源。

引數二為開啟方式,預設值0表示以共享方式開啟資料庫,帶有寫訪問,不裝入odbc游標庫dll,並且只有在沒有足夠資訊形

成連線時顯示odbc連線對話方塊。可選引數如下:

cdatabase::openexclusive:此類庫版本不支援。為共享資料來源總是開啟的。如果選定此選項,斷言失敗。

cdatabase::openreadonly:以唯讀方式開啟

cdatabase::usecursorlib 裝入odbc游標庫dll。游標掩蓋了基礎odbc驅動程式的一些功能,有效地阻止使用動態集(如果

驅動程式支援它們)。如果裝入游標庫,支援的唯一游標是靜態快照和只能向前游標。預設值為true。如果計畫從crecordset直接建立

乙個記錄集物件而不派生,則不應裝入游標庫。

cdatabase::noodbcdialog:不管是否提供了足夠的連線資訊,不顯示odbc連線對話方塊。

cdatabase::forceodbcdialog:總是顯示odbc連線對話方塊。

如果要使用信任連線,即不需要使用者名稱和密碼,則應該使用open方法,但在開啟記錄集時有限制,見後。

(注:建立資料來源方法:控制面板—>管理工具—>資料來源(odbc)—>新增,選擇對應的驅動程式,如資料庫在sql server下則選擇

sql server—>完成輸入資料名稱,描述,選擇伺服器"(local)",下一步,選擇使用者輸入登陸id和密碼的sql server驗證,輸入登陸id和

密碼,下一步,勾選更改預設資料庫,下一步,完成,測試。)

b . 定義crecordset物件,呼叫其open方法開啟記錄集,如

crecordset rs(&m_db);

virtual bool open( uint nopentype = afx_db_use_default_type, lpctstr lpszsql = null, dword dwoptions = none

); 引數一為開啟型別,如下:

afx_db_use_default_type:預設值

crecordset::dynaset:動態記錄集,支援雙向游標,並保持同所連線的資料來源同步,對資料的更新操作可以通過乙個fetch操

作獲取。

crecordset::snapshot:靜態快照,一旦形成記錄集,此後資料來源的所有改變都不能體現在記錄集裡,應用程式必須重新進行

查詢,才能獲取對資料的更新。該型別記錄集也支援雙向游標。

crecordset::dynamic:同crecordset::dynaset記錄集相比,crecordset::dynamic記錄還能在fetch操作裡同步其它使用者對資料

odbc不支援動態指標錯誤,而用crecordset::forwardonly則出現無效的游標位置錯誤

c . 繫結記錄集(通過rfx)

通過嚮導插入cmyset類且以crecordset為基類時,會自動生成與表字段對應的變數,並在cmyset的dofieldexchange中自動與表

字段繫結,如:rfx_long(pfx,_t("[列名]"),變數名);pfx為cfieldexchange類指標。(注意字段型別)

繫結之後,就可以使用這些變數更新對應字段,如新增,先呼叫addnew,然後呼叫setfieldnull($變數名,false)將該字段標記

為臟資料(changed),最後給變數賦值,呼叫update將新記錄儲存到資料庫,requery重新整理記錄集並將記錄集指標回到第一條記錄處,完成

插入。在addnew和edit後必須update完成操作。呼叫edit後可以修改當前記錄。

d . 引數化記錄集和查詢

crecordset成員變數:m_strfilter負責對記錄集進行過濾,它存放著sql語句中where子句的條件字串,通過

m_strfilter="列名='值'"方式賦值,賦值後呼叫該物件開啟或重新整理的記錄集已經過濾,並且引數二只需給出表名rs.open

(crecordset::snapshot,"book")。m_strsort對記錄集進行排序,m_strsort="列名".如果在open的lpszsql引數中已包括了where和

order by子句,那麼m_strfilter和m_strsort必需為空.

除直接賦值外,還可以使用引數化:

(1) 宣告參變數,**如下:

cstring strname;

int nage;

(2) 在建構函式中初始化參變數如下:

strname =_t("");

nage =0;

m_nparams=2;

(3) 將參變數與對應列繫結,**如下:

pfx->setfieldtype(cfieldexchange::param)

rfx_text(pfx,_t("name"), strname);

rfx_single(pfx,_t("age"), nage);

完成以上步驟之後就可以利用參變數進行條件查詢了,**如下:

m_pmyrs->m_strfilter="name=? and age=?";

m_ pmyrs -> strname ="feng";

m_ pmyrs ->nage=20;

m_ pmyrs ->open();//如果記錄集已經開啟,則重新整理

參變數的值按繫結的順序替換查詢字串中的「?」萬用字元。

f . 書籤定位:在當前記錄處設定書籤,經過一系列移動後再查詢該書簽處記錄,可直接返回書籤位置

cdbvarint bookmark;

rs.getbookmark(bookmark);//獲取當前記錄儲存到書籤中

rs.setbookmark(bookmark);//返回書籤位置

使用書籤前可通過crecordset::canbookmark確定是否支援書籤定位,如果是,還需要在記錄集的open函式的dwoptions中加上

crecordset::usebookmark,在呼叫之前呼叫cdatabase::getbookmarkpersistence來核對是否可以安全呼叫setbookmark

絕對定位: row=10;

rs.setabsouteposition(row);

只向前滾動的記錄集不支援定位。

注:如果不涉及從資料庫中獲取記錄,就不需要開啟記錄集,在資料來源開啟後,直接呼叫cdatabase::executesql執行sql語句,如插

入、刪除、更新等。只有在需要從資料庫中獲取記錄時才開啟記錄集,用while( ! rs.iseof( ))判斷是否超出記錄集最後一條記錄,如果

沒有繫結記錄集,可用getfieldvalue取當前記錄的字段值,用movenext移到下一條記錄。繫結記錄集後,變數的值就是資料庫中對應的

欄位的值,可以直接對變數進行操作,不需要再用getfieldvalue獲取。對於資料庫中的資料型別與c++資料型別的轉換,我將另外討論

。 二、事務處理

首先呼叫cdatabase::begintrans( )開始事務,committrans提交事務,rollback回退,撤銷操作

三、異常處理:在資料庫程式設計時,一般會出現的異常可用以下語句捕獲

try

catch(cdbexception,ex)

and_catch(cmemoryexception,pex)

and_catch(cexception,e)

end_catch

由於本人水平有限,如果有什麼問題,希望大家指正,謝謝!

再有一點,建立工程後,需要自己新增afxdb.h標頭檔案,應為odbc類定義在此檔案中... s

VC學習之一

vc6寫的例子,用vs2008開啟,報錯 fatal error c1083 無法開啟包括檔案 iostream.h no such file or directory 原因是 在vc6下的寫法,include vc9應改為 include 另外,要新增using namespace std 否則會...

分頁查詢例子之一

對問題分類資訊進行分頁 public listgetquestiongroupall int maximumrows,int startrowindex listquestiongroupslist new list foreach datarow dr in dt.rows return ques...

VC 資料庫程式設計 之一

2.將控制項繫結響應的成員變數m pset m id,m pset m name,m pset m gradyear.注 m pset是cmyset的指標,它的父類是crecordset.crecordset為記錄集類,是mfc封裝的用於處理資料庫記錄集的類。部分成員如下 movefirst mov...