日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
舉例介紹VC++中的ODBC編程

ODBC(怒放式數(shù)據(jù)庫Databnse連接)是一種應(yīng)用SQL的程式設(shè)計(jì)接口,應(yīng)用ODBC使數(shù)據(jù)庫Databnse實(shí)際運(yùn)用程式的編寫者避免了與數(shù)據(jù)源相連接的復(fù)雜性。利用ODBC技能使得程式員從具體的DBMS中解脫出來,從而能夠遞減熱門軟件開發(fā)的務(wù)工量,縮短開發(fā)周期,并升高效率和熱門軟件的可靠性。這項(xiàng)技能目前已經(jīng)得到了大多數(shù)DBMS廠商的廣泛支持。

Microsoft Developer Studio為大多數(shù)達(dá)標(biāo)的數(shù)據(jù)庫Databnse各式幫助了32位ODBC驅(qū)動(dòng)器。這一部份達(dá)標(biāo)數(shù)據(jù)各式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle數(shù)據(jù)庫以及Microsoft Text。假如用戶期望應(yīng)用更多有聯(lián)系數(shù)據(jù)各式,則需求安裝相應(yīng)的ODBC驅(qū)動(dòng)器及DBMS。

用戶應(yīng)用自個(gè)的DBMS數(shù)據(jù)庫Databnse管制功能生成新的數(shù)據(jù)庫Databnse模式后,就能夠應(yīng)用ODBC來登錄數(shù)據(jù)源。對(duì)用戶的實(shí)際運(yùn)用程式來說,只要安裝有驅(qū)動(dòng)程式,就能注冊(cè)很多不相同的數(shù)據(jù)庫Databnse。登錄數(shù)據(jù)庫Databnse的具體操作參見有關(guān)ODBC的聯(lián)機(jī)幫助。

一、MFC幫助的ODBC數(shù)據(jù)庫Databnse類

Visual C++的MFC基類庫定義了幾個(gè)數(shù)據(jù)庫Databnse類。在利用ODBC編程時(shí),經(jīng)常要應(yīng)用到 CDatabase(數(shù)據(jù)庫Databnse類)、CRecordSet(記錄集類)和CRecordView(可視記錄集類)。

CDatabase類對(duì)象幫助了對(duì)數(shù)據(jù)源的連接,經(jīng)過它能夠?qū)?shù)據(jù)源停止操作。

CRecordSet類對(duì)象幫助了從數(shù)據(jù)源中提取出的記錄集。CRecordSet對(duì)象通日常于兩種形式:動(dòng)態(tài)行集(dynasets)和快照集(snapshots)。動(dòng)態(tài)行集能與更多有聯(lián)系用戶所做的更改保持同步,快照集則是數(shù)據(jù)的唯一靜態(tài)視圖。每種形式在記錄集被打開時(shí)都幫助一組記錄,所不相同的是,當(dāng)在唯一動(dòng)態(tài)行集里滾動(dòng)到一條記錄時(shí),由更多有聯(lián)系用戶或?qū)嶋H運(yùn)用程式中的更多有聯(lián)系記錄集對(duì)該記錄所做的更改會(huì)相應(yīng)地呈現(xiàn)出來。

CRecordView類對(duì)象能以控件的形式呈現(xiàn)數(shù)據(jù)庫Databnse記錄,那個(gè)視圖是直接連到唯一CRecordSet對(duì)象的表視圖。

二、實(shí)際運(yùn)用ODBC編程

實(shí)際運(yùn)用Visual C++的AppWizard能夠自動(dòng)生成唯一ODBC實(shí)際運(yùn)用程式框架,步驟是:打開File菜單的New選項(xiàng),選取Projects,填入工程名,選取MFC AppWizard (exe),然后按AppWizard的提示停止操作。

當(dāng)AppWizard詢問也許包含數(shù)據(jù)庫Databnse支持時(shí),假如想讀寫數(shù)據(jù)庫Databnse,那么選定Database view with file support;假如想來訪數(shù)據(jù)庫Databnse的消息而不想寫回所做的改變,那么選定Database view without file support。

選好數(shù)據(jù)庫Databnse支持之后,Database Source 按鈕會(huì)被激活,選中它去調(diào)用Data Options對(duì)話框。在Database Options對(duì)話框中會(huì)呈現(xiàn)出已向ODBC注冊(cè)的數(shù)據(jù)庫Databnse資源,選定所要操作的數(shù)據(jù)庫Databnse,如:Super_ES,單擊OK后呈現(xiàn)Select Database Tables對(duì)話框,其中列舉了選中的數(shù)據(jù)庫Databnse包含的全部表;選取要操作的表后,單擊OK。在選定了數(shù)據(jù)庫Databnse和數(shù)據(jù)表之后,就能夠按照慣例繼續(xù)停止AppWizard操作。

特別需求指出的是:在生成的實(shí)際運(yùn)用程式框架View類(如:CSuper_ESView)中,包含唯一指向CSuper_ESSet對(duì)象的指針m_pSet,該指針由AppWizard建立,目的是在視表單和記錄集之間建立聯(lián)系,使得記錄集中的查詢結(jié)果能夠很簡易地在視表單上呈現(xiàn)出來。
要使程式與數(shù)據(jù)源建立聯(lián)系,需用CDateBase::OpenEx()或CDatabase::Open()參數(shù)來停止初始化。數(shù)據(jù)庫Databnse對(duì)象必需在應(yīng)用它構(gòu)造記錄集對(duì)象之前初始化。

#p#

三、舉例

1.查詢記錄

查詢記錄應(yīng)用CRecordSet::Open()和CRecordSet::Requery()成員參數(shù)。在應(yīng)用CRecordSet類對(duì)象之前,必需應(yīng)用CRecordSet::Open()參數(shù)來獲得有效的記錄集。一旦已經(jīng)應(yīng)用過CRecordSet::Open()參數(shù),再次查詢時(shí)就能夠?qū)嶋H運(yùn)用CRecordSet::Requery()參數(shù)。

在調(diào)用CRecordSet::Open()參數(shù)時(shí),假如將唯一已經(jīng)打開的CDatabase對(duì)象指針傳給CRecordSet類對(duì)象的m_pDatabase成員變量,則應(yīng)用該數(shù)據(jù)庫Databnse對(duì)象建立ODBC連接;否則假如m_pDatabase為空指針,就新建唯一CDatabase類對(duì)象,并使其與缺省的數(shù)據(jù)源相連,然后停止CRecordSet類對(duì)象的初始化。缺省數(shù)據(jù)源由GetDefaultConnect()參數(shù)獲得。也能夠幫助所需求的SQL語句,并以它來調(diào)用CRecordSet::Open()參數(shù),

例如:

 
 
  1. Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

假如沒有指定參數(shù)parameter,程式則應(yīng)用缺省的SQL語句,即對(duì)在GetDefaultSQL()參數(shù)中指定的SQL語句停止操作:

 
 
  1. CString CSuper_ESSet::GetDefaultSQL()
  2. {return _T(″[BsicData],[MinSize]″);}

對(duì)于GetDefaultSQL()參數(shù)返回的表名,對(duì)應(yīng)的缺省操作是SELECT語句,即:

 
 
  1. SELECT * FROM BasicData,MainSize

在查詢過程中,也能夠利用CRecordSet的成員變量m_strFilter和m_strSort來執(zhí)行要求查詢和結(jié)果排序。m_strFilter為濾掉字符串,存放著SQL語句中WHERE后的要求串;m_strSort為排序字符串,存放著SQL語句中ORDER BY后的字符串。如:

 
 
  1. Super_ESSet.m_strFilter=″TYPE=‘電動(dòng)機(jī)’″;
  2. Super_ESSet.m_strSort=″VOLTAGE″;
  3. Super_ESSet.Requery();

對(duì)應(yīng)的SQL語句為:

 
 
  1. SELECT * FROM BasicData,MainSize
  2. WHERE TYPE=‘電動(dòng)機(jī)’
  3. ORDER BY VOLTAGE

除了直接賦值給m_strFilter以外,還能夠應(yīng)用參數(shù)parameter化。利用參數(shù)parameter化能夠更直觀、更方便地完成要求查詢?nèi)蝿?wù)。應(yīng)用參數(shù)parameter化的步驟如下:

S聲明參變量:

 
 
  1. CString p1;
  2. float p2;

S在構(gòu)造參數(shù)中初始化參變量:

 
 
  1. p1=_T(″″);
  2. p2=0.0f;
  3. m_nParams=2;

S將參變量與對(duì)應(yīng)列綁定:

 
 
  1. pFX->SetFieldType(CFieldExchange::param)
  2. RFX_Text(pFX,_T(″P1″),p1);
  3. RFX_Single(pFX,_T(″P2″),p2);

完成以上步驟后就能夠利用參變量停止要求查詢:

 
 
  1. m_pSet->m_strFilter=″TYPE=? AND VOLTAGE=?″;m_pSet->p1=″電動(dòng)機(jī)″;
  2. m_pSet->p2=60.0;
  3. m_pSet->Requery();

參變量的值按綁定的順序替換查詢字串中的“?”通配符。

假如查詢的結(jié)果是多條記錄,能夠用CRecordSet類的參數(shù)Move()、MoveNext()、MovePrev()、MoveFirst()和MoveLast()來移動(dòng)光標(biāo)。

2.漸增記錄

漸增記錄應(yīng)用AddNew()參數(shù),要求數(shù)據(jù)庫Databnse必需是以允許漸增的方法打開:

 
 
  1. m_pSet->AddNew(); //在表的末尾漸增新記錄
  2. m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE);
  3. m_pSet->m_type=″電動(dòng)機(jī)″;
  4. ……
  5. //輸入新的字段值
  6. m_pSet->Update();
  7. //將新記錄存入數(shù)據(jù)庫Databnse
  8. m_pSet->Requery();
  9. //重建記錄集

3.刪除記錄

能夠直接應(yīng)用Delete()參數(shù)來刪除記錄,并且在調(diào)用Delete()參數(shù)之后不需調(diào)用Update()參數(shù):

 
 
  1. m_pSet->Delete();
  2. if (!m_pSet->IsEOF())
  3. m_pSet->MoveNext();
  4. else
  5. m_pSet->MoveLast();

4.改正記錄

改正記錄應(yīng)用Edit()參數(shù):

 
 
  1. m_pSet->Edit();
  2. //改正當(dāng)前記錄
  3. m_pSet->m_type=″發(fā)電機(jī)″;
  4. //改正當(dāng)前記錄字段值
  5. ……
  6. m_pSet->Update(); //將改正結(jié)果存入數(shù)據(jù)庫Databnse
  7. m_pSet->Requery();

5.撤消操作

假如用戶選取了漸增或者改正記錄后期望放棄當(dāng)前操作,能夠在調(diào)用Update()參數(shù)之前調(diào)用:
CRecordSet::Move(AFX_MOVE_REFRESH)來撤消漸增或改正模式,并恢復(fù)在漸增或改正模式之前的當(dāng)前記錄。其中,參數(shù)parameterAFX_MOVE_REFRESH的值為零。

6.數(shù)據(jù)庫Databnse連接的復(fù)用

在CRecordSet類中定義了唯一成員變量m_pDatabase:

 
 
  1. CDatabase* m_pDatabase;

它是指向?qū)ο髷?shù)據(jù)庫Databnse類的指針。假如在CRecordSet類對(duì)象調(diào)用Open()參數(shù)之前,將唯一已經(jīng)打開的CDatabase類對(duì)象指針傳給m_pDatabase,就能共享相同的CDatabase類對(duì)象。如:

 
 
  1. CDatabase m_db;
  2. CRecordSet m_set1,m_set2;
  3. m_db.Open(_T(″Super_ES″)); //建立ODBC連接
  4. m_set1.m_pDatabase=&m_db;
  5. //m_set1復(fù)用m_db對(duì)象
  6. m_set2.m_pDatabse=&m_db;
  7. // m_set2復(fù)用m_db對(duì)象

7.SQL語句的直接執(zhí)行

雖然咱們能夠經(jīng)過CRecordSet類完成大多數(shù)的查詢操作,而且在CRecordSet::Open()參數(shù)中也能夠幫助SQL語句,但是有時(shí)候咱們還那樣期望停止一部份更多有聯(lián)系操作,例如建立新表、刪除表、建立新的字段等,這時(shí)就需求應(yīng)用CDatabase類直接執(zhí)行SQL語句的機(jī)制。經(jīng)過調(diào)用CDatabase::ExecuteSQL()參數(shù)來完成SQL語句的直接執(zhí)行:

 
 
  1. BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
  2. {TRY
  3. {m_pdb->ExecuteSQL(strSQL);
  4. //直接執(zhí)行SQL語句}
  5. CATCH (CDBException,e)
  6. {CString strMsg;
  7. strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
  8. strMsg+=strSQL;
  9. return FALSE;}
  10. END_CATCH
  11. return TRUE;}

應(yīng)當(dāng)指出的是,由于不相同的DBMS幫助的數(shù)據(jù)操作語句不盡相同,直接執(zhí)行SQL語句估計(jì)會(huì)破壞熱門軟件的DBMS無關(guān)性,因此在實(shí)際運(yùn)用中應(yīng)當(dāng)慎用此類操作。

8.動(dòng)態(tài)連接表

表的動(dòng)態(tài)連接能夠利用在調(diào)用CRecordSet::Open()參數(shù)時(shí)指定SQL語句來呈現(xiàn)。同唯一記錄集對(duì)象只能來訪具有相同框架的表,否則查詢結(jié)果將無法與變量相對(duì)應(yīng)。

 
 
  1. void CDB::ChangeTable()
  2. {
  3. if (m_pSet->IsOpen()) m_pSet->Close();
  4. switch (m_id)
  5. {
  6. case 0:
  7. m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,
  8. ″SELECT * FROM SLOT0″);
  9. //連接表SLOT0
  10. m_id=1;
  11. break;
  12. case 1:
  13. m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,
  14. ″SELECT * FROM SLOT1″); //連接表SLOT1
  15. m_id=0;
  16. break; }}

9.動(dòng)態(tài)連接數(shù)據(jù)庫Databnse

能夠經(jīng)過賦與CRecordSet類對(duì)象參數(shù)parameterm_pDatabase來連接不相同數(shù)據(jù)庫Databnse的CDatabase對(duì)象指針,從而呈現(xiàn)動(dòng)態(tài)連接數(shù)據(jù)庫Databnse。

 
 
  1. void CDB::ChangeConnect()
  2. {CDatabase* pdb=m_pSet->m_pDatabase;
  3. pdb->Close();
  4. switch (m_id)
  5. {
  6. case 0:
  7. if (!pdb->Open(_T(″Super_ES″)))
  8. //連接數(shù)據(jù)源Super_ES
  9. {
  10. AfxMessageBox(″數(shù)據(jù)源Super_ES打開失敗″,″請(qǐng)檢查相應(yīng)的ODBC連接″, MB_OK|MB_ICONWARNING);
  11. exit(0);
  12. }
  13. m_id=1;
  14. break;
  15. case 1:
  16. if (!pdb->Open(_T(″Motor″)))
  17. //連接數(shù)據(jù)源Motor
  18. {
  19. AfxMessageBox(″數(shù)據(jù)源Motor打開失敗″,″請(qǐng)檢查相應(yīng)的ODBC連接″, MB_OK|MB_ICONWARNING);
  20. exit(0);
  21. }
  22. m_id=0;
  23. break; }}

總結(jié):Visual C++中的ODBC類庫能夠幫助程式員完成絕大多數(shù)的數(shù)據(jù)庫Databnse操作。利用ODBC技能使得程式員從具體的DBMS中解脫出來,從而能夠遞減熱門軟件開發(fā)的務(wù)工量,縮短開發(fā)周期,并升高效率和熱門軟件的可靠性。希望本文能對(duì)你有幫助。


網(wǎng)頁標(biāo)題:舉例介紹VC++中的ODBC編程
URL網(wǎng)址:http://m.5511xx.com/article/cogdsho.html