一、mfc提供的odbc資料庫類
visual c++的mfc基類庫定義了幾個資料庫類。在利用odbc程式設計時,經常要使用到 cdatabase(資料庫類)、crecordset(記錄集類)和crecordview(可視記錄集類)。
cdatabase類物件提供了對資料來源的連線,通過它可以對資料來源進行操作。
crecordset類物件提供了從資料來源中提取出的記錄集。crecordset物件通常用於兩種形式:動態行集(dynasets)和快照集(snapshots)。動態行集能與其他使用者所做的更改保持同步,快照集則是資料的乙個靜態檢視。每種形式在記錄集被開啟時都提供一組記錄,所不同的是,當在乙個動態行集裡滾動到一條記錄時,由其他使用者或應用程式中的其他記錄集對該記錄所做的更改會相應地顯示出來。
crecordview類物件能以控制項的形式顯示資料庫記錄,這個檢視是直接連到乙個crecordset物件的表檢視。
二、應用odbc程式設計
三、例項
1.查詢記錄
查詢記錄使用crecordset::open()和crecordset::requery()成員函式。在使用crecordset類物件之前,必須使用crecordset::open()函式來獲得有效的記錄集。一旦已經使用過crecordset::open()函式,再次查詢時就可以應用crecordset::requery()函式。
在呼叫crecordset::open()函式時,如果將乙個已經開啟的cdatabase物件指標傳給crecordset類物件的m_pdatabase成員變數,則使用該資料庫物件建立odbc連線;否則如果m_pdatabase為空指標,就新建乙個cdatabase類物件,並使其與預設的資料來源相連,然後進行crecordset類物件的初始化。預設資料來源由getdefaultconnect()函式獲得。也可以提供所需要的sql語句,並以它來呼叫crecordset::open()函式,例如:super_esset.open(afx_database_use_default,strsql);
如果沒有指定引數,程式則使用預設的sql語句,即對在getdefaultsql()函式中指定的sql語句進行操作:
cstring csuper_esset::getdefaultsql()
對於getdefaultsql()函式返回的表名,對應的預設操作是select語句,即:
select *from basicdata,mainsize
在查詢過程中,也可以利用crecordset的成員變數m_strfilter和m_strsort來執行條件查詢和結果排序。m_strfilter為過濾字串,存放著sql語句中where後的條件串;m_strsort為排序字串,存放著sql語句中order by後的字串。如:
super_esset.m_strfilter=″type=『電動機』″;
super_esset.m_strsort=″voltage″;
super_esset.requery();
對應的sql語句為:
select *from basicdata,mainsize
where type=『電動機』
order by voltage
除了直接賦值給m_strfilter以外,還可以使用引數化。利用引數化可以更直觀、更方便地完成條件查詢任務。使用引數化的步驟如下:
s宣告參變數:
cstring p1;
float p2;
s在建構函式中初始化參變數:
p1=_t(″″);
p2=0.0f;
m_nparams=2;
s將參變數與對應列繫結:
pfx->setfieldtype(cfieldexchange::param)
rfx_text(pfx,_t(″p1″),p1);
rfx_single(pfx,_t(″p2″),p2);
完成以上步驟後就可以利用參變數進行條件查詢:
m_pset->m_strfilter=″type=? and voltage=?″;m_pset->p1=″電動機″;
m_pset->p2=60.0;
m_pset->requery();
參變數的值按繫結的順序替換查詢字串中的「?」萬用字元。
如果查詢的結果是多條記錄,可以用crecordset類的函式move()、movenext()、moveprev()、movefirst()和movelast()來移動游標。
2.增加記錄
增加記錄使用addnew()函式,要求資料庫必須是以允許增加的方式開啟:
m_pset->addnew(); //在表的末尾增加新記錄
m_pset->setfieldnull(&(m_pset->m_type), false);
m_pset->m_type=″電動機″;
……//輸入新的字段值
m_pset->update();
//將新記錄存入資料庫
m_pset->requery();
//重建記錄集
3.刪除記錄
可以直接使用delete()函式來刪除記錄,並且在呼叫delete()函式之後不需呼叫update()函式:
m_pset->delete();
if (!m_pset->iseof())
m_pset->movenext();
else
m_pset->movelast();
4.修改記錄
修改記錄使用edit()函式:
m_pset->edit();
//修改當前記錄
m_pset->m_type=″發電機″;
//修改當前記錄字段值
……m_pset->update(); //將修改結果存入資料庫
m_pset->requery();
5.撤消操作
如果使用者選擇了增加或者修改記錄後希望放棄當前操作,可以在呼叫update()函式之前呼叫:
crecordset::move(afx_move_refresh)來撤消增加或修改模式,並恢復在增加或修改模式之前的當前記錄。其中,引數afx_move_refresh的值為零。
6.資料庫連線的復用
在crecordset類中定義了乙個成員變數m_pdatabase:
cdatabase* m_pdatabase;
它是指向物件資料庫類的指標。如果在crecordset類物件呼叫open()函式之前,將乙個已經開啟的cdatabase類物件指標傳給m_pdatabase,就能共享相同的cdatabase類物件。如:
cdatabase m_db;
crecordset m_set1,m_set2;
m_db.open(_t(″super_es″)); //建立odbc連線
m_set1.m_pdatabase=&m_db;
//m_set1復用m_db物件
m_set2.m_pdatabse=&m_db;
// m_set2復用m_db物件
7.sql語句的直接執行
雖然我們可以通過crecordset類完成大多數的查詢操作,而且在crecordset::open()函式中也可以提供sql語句,但是有時候我們還是希望進行一些其他操作,例如建立新錶、刪除表、建立新的字段等,這時就需要使用cdatabase類直接執行sql語句的機制。通過呼叫cdatabase::executesql()函式來完成sql語句的直接執行:
bool cdb::executesqlandreportfailure(const cstring& strsql)
catch (cdbexception,e)
end_catch
return true;}
應當指出的是,由於不同的dbms提供的資料操作語句不盡相同,直接執行sql語句可能會破壞軟體的dbms無關性,因此在應用中應當慎用此類操作。
8.動態連線表
表的動態連線可以利用在呼叫crecordset::open()函式時指定sql語句來實現。同乙個記錄集物件只能訪問具有相同結構的表,否則查詢結果將無法與變數相對應。
void cdb::changetable()}
9.動態連線資料庫
可以通過賦與crecordset類物件引數m_pdatabase來連線不同資料庫的cdatabase物件指標,從而實現動態連線資料庫。
void cdb::changeconnect()
m_id=1;
break;
case 1:
if (!pdb->open(_t(″motor″)))
//連線資料來源motor
m_id=0;
break;}}
總結:
visual c++中的odbc類庫可以幫助程式設計師完成絕大多數的資料庫操作。利用odbc技術使得程式設計師從具體的dbms中解脫出來,從而可以減少軟體開發的工作量,縮短開發周期,並提高效率和軟體的可靠性。
Visual C 中的ODBC程式設計
microsoft developer studio為大多數標準的資料庫格式提供了32位odbc驅動器。這些標準資料格式包括有 sql server access paradox dbase foxpro excel oracle以及microsoft text。如果使用者希望使用其他資料格式,則需...
Visual C 中的ODBC程式設計例項
microsoft developer studio為大多數標準的資料庫格式提供了32位odbc驅動器。這些標準資料格式包括有 sql server access paradox dbase foxpro excel oracle以及microsoft text。如果使用者希望使用其他資料格式,則需...
Visual C 程式設計中的檔案操作
文章資訊 聶棟棟2004 12 01 出處 csdn方舟 本文對visual c 中有關檔案操作進行了全面的介紹,並對在檔案操作中經常遇到的一些疑難問題進行了詳細分析 正文 各種關於檔案的操作在程式設計中十分常見,如果能對這些操作都瞭如指掌,就可以根據實際情況找到最佳的解決方案,從而可以在較短的時間...