VC資料庫訪問技術之ODBC

2021-06-01 08:51:37 字數 4754 閱讀 6005

部落格轉移:

說明:mfc 資料庫訪問方式有:odbc,dao,ado

odbc資料庫程式設計:

1.建立資料來源.

2.連線到資料來源:

1)在visual c++程式中使用剛才建立的資料來源之前,還必須簡歷乙個到資料來源的連線.

在mfc中到資料來源的連線封裝在cdatabase類中,要使用cdatabase物件,在odbc資料來源管理器中資料來源必須已經正確配置.

在同乙個程式中可以使用多個資料來源,或者多個連線對應同乙個資料來源.

連線函式:

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

throw(cdbexception,cmemoryexception);

cdatabase m_db;

trycatch(cdbexception ex)

and_catch(cmemoryexception *pex)

and_catch(cmemoryexception *pex)

and_catch(cexception *e)

end_catch

連線乙個已經配置好的資料來源有一下方法:

cdatabase m_database;//宣告物件

//測試庫是否已經處於開啟狀態

if(!m_database.isopen())

//......

//關閉連線

m_database.close();

}下面的**段也可以開啟乙個資料來源的連線,是更為完整的表述.

cdatabase *pdb=new cdatabase;

bool bstatus=false;        //資料庫是否成功開啟標誌

//設定連線超時屬性為3秒鐘

pdb->setlogintimeout(3);

trycatch(cmemoryexception* pex)//處理記憶體異常

catch(cdbexception*pdbex)

pdb->close();

2)建立結果集

在crecordset類中定義乙個成員變數m_pdatabase,它是指向物件資料庫類的指標.

使用者可以通過一下方式將這個結果集對應到相應的資料來源.

//m_database是上一小節已經宣告過並連線到資料來源的cdatabase物件.

crecordset m_recordset1,m_recordset2;

m_recordset1.m_pdatabase=&m_database;    //m_recordset1復用m_database物件

m_recordset2.m_pdatabase=&m_database;    //m_recordset2復用m_database物件

3)新增和修改記錄

增加記錄可以使用addnew()函式,要求資料庫必須是以允許增加方式開啟

m_recordset.addnew();        //在表的末尾增加新的記錄

...//輸入新的字段值

m_recordset1.update();        //將新記錄存入資料庫

m_recordset1.requery();        //重建記錄集

修改記錄可以使用edit()函式.如下所示:

//m_pset是指向結果集m_recordset2的指標

m_pset->edit();                //修改當前記錄

m_pset->m_type="完成";        //修改當前記錄的字段值

......

m_pset->update();            //將修改結果存入資料庫

m_pset->requery();            //重建記錄集

4)查詢記錄

查詢記錄可以使用crecordset::open()和crecordset::requery()成員函式.

在使用crecordset類物件之前,必須使用crecordset::open()函式來獲得有效的記錄集.

一旦已經使用過crecordset::open()函式,那麼下一次查詢時就可以使用crecordset::requery()函式了.

在呼叫crecordset::open()函式時,如果已經將乙個開啟的cdatabase物件指標傳給crecordset類物件的m_pdatabase成員變數,那麼就可以使用該資料庫物件建立odbc連線;否則(即m_pdatabase為空指標),就需要新建乙個cdatabase類物件並使其與預設的資料來源相連,然後進行crecordset類物件的初始化.預設資料來源由getdefaultconnect()函式獲得.

下面是幾種查詢方法,使用者可以選擇使用:

1.通過sql語句開啟記錄集

sql語句中包含查詢條件

lpctstr strsql;//strsql是包含查詢條件的sql語句

m_recordset1.open(strsql);//m_recordset1是結果集的乙個物件

2.使用m_strfilter和m_strsort

查詢過程中也可以使用crecordset的成員變數m_strfilter和m_strsort來執行條件查詢和結果排序.

其中,m_strfilter為過濾字串,存放的是sql語句中where以後的條件,而m_strsort為排序字串,存放的是sql語句中order by之後的字串.下面是乙個簡單的例子:

//emploryee_age是引數

_itoa(employee_age,ch,8);        //employee_age是待查詢記錄的emp_age值

m_recordset1.m_strfilter="emp_age="+cstring(ch);

m_recordset1.m_strsort="emp_id asc";

m_recordset1.requery();

對應的sql語句為

select * from personnel

where emp_age=employee_age

order by emp_id asc;

3.引數查詢

利用引數化可以更直觀、更方便地完成條件查詢任務.具體使用的方法如下:

(1)宣告參變數

int employee_age;

cstring strdept;

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

employee_age=24;

strdept=_t("manufacture");        //manufacture為員工所在部門

m_nparams=2;

(3)將列與引數進行繫結

pfx->setfieldtype(cfieldexchage::param)

rfx_int(pfx,_t("emp_age"),employee_age);

rfx_text(pfx,_t("dept_name"),strdept);

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

m_recordset1->m_strfilter="emp_age=? and dept_name=?";

m_recordset1->emp_age=24;

m_recordset1->dept_name="manufacture";

m_recordset1->requery();

參變數的值按繫結的順序替換查詢字串中的"?"適配符

如果查詢結果是多條記錄,可以用crecordset類的函式movefirset()和movenext()函式來取得結果集中相對應的記錄.

總結:以上方法各有優劣,一般請看下sql查詢是最簡單的一種,可以直接通過sql語句得到查詢結果,一般的應用開發僅用此方法即可.

5)刪除記錄

用delete()函式即可,並且在呼叫delete()函式後不需要再呼叫update()函式.

m_pset->delete();

6)撤銷操作

如果使用者選擇了增加或修改記錄後希望放棄當前的操作,可以在呼叫update()函式之前呼叫crecordset::move(afx_move_refresh)來撤銷增加或修改模式,並恢復在增加或修改模式之前的當前記錄.其中引數afx_move_refresh的值為0.

7)記錄集的其他操作

比如,從結果集中取得各個域的值,可以先宣告乙個cdbvariant物件,然後通過crecordset::getfieldvalue()函式來取值到cdbvariant物件,在根據值的型別吧cdbvariant的相應成員變數賦給所需要的變數.

m_recordset.getfieldvalue(2,varvalue);        //2是域的位置,varvalue是cdbvariant物件

int i=varvariant.m_ival;                    //如果這個域對應的型別是整數

而crecordset::getrecordcount()函式可以返回還未訪問過的結果集裡的記錄數,可以用來判斷結果集是否為空.

8)sql語句的直接執行

通過crecordset類可以完成大多數的查詢操作,但有時需要對資料庫建立新錶、刪除表和建立新的字段等,這就需要用到cdatabase類直接執行sql語句的機制.這可以用過cdatabase::executesql()函式來完成.

//下面是為自己建立的類ctry編寫執行sql的函式myexecutesql

bool ctry::myexecutesql(const cstring& strsql)

catch(cdbexception*e)

end_catch

return true;

}

VC連線Oracle資料庫之ODBC及ADO

一.odbc連oracle str.format driver server oracleserver.world uid username pwd asdasd 二.ado連線oracle 2.要使用net configuration assistant配置好偵聽及相關環境 首先,在 stdafx...

VC 提供的資料庫訪問技術

odbc api mfc odbc dao ole db ado 訪問速度 傳統的 odbc 速度較慢。ole db 和ado 都是基於 com技術,使用該技術可以直接訪問資料庫的驅動程式,速度大大提高。可擴充套件性 通過 ole db 和activex 技術,可以利用 vc提供的各種元件,控制項和...

使用ODBC訪問資料庫 二

使用c c 語言開發,那麼必定會在與odbc語言間存在資料的轉換的問題,因為odbc所存在的一些資料型別在c語言中是不存在的。所以在odbc的開發過程中不要使用int,float之類的c語言的實際型別來定義變數而應該使用odbc定義的資料型別來定義變數,如sqlinteger,sqlfloat。在o...