国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用MFCODBC編寫數(shù)據(jù)庫應用程序
1、 使用MFC訪問ODBC數(shù)據(jù)源
EMIAL:zzh1415@21cn.com
3.1    概述
VisualC++的MFC類庫定義了幾個數(shù)據(jù)庫類。在利用ODBC編程時,經(jīng)常要使用到CDatabase(數(shù)據(jù)庫類),CRecordSet(記錄集類)和CRecordView(可視記錄集類)。 其中:
CDatabase類對象提供了對數(shù)據(jù)源的連接,通過它你可以對數(shù)據(jù)源進行操作。
CRecordView類對象能以控制的形式 顯示數(shù)據(jù)庫記錄。這個視圖是直接連到一個CRecordSet對象的表視圖。
CRecordSet類對象提供了從數(shù)據(jù)源 中提取出的記錄集。CRecordSet對象通常用于兩種形式:動態(tài)行集(dynasets)和快照集(snapshots)。動態(tài)行集能保持與其他用戶所做的更改保持同步??煺占瘎t是數(shù)據(jù)的一個靜態(tài)視圖。每一種形式在記錄集被打開時都提供一組記錄,所不同的是,當你在一個動態(tài)行集里滾動到一條記錄時,由其他用戶或是你應用程序中的其他記錄集對該記錄所做的更改會相應地顯示出來。

VisualC++提供了幾種記錄集,可以用來定制應用程序的工作方式。查看這些不同選項的最快方式要兼顧速度和特征。你會發(fā)現(xiàn),在很多情況下,如果想添加特征,就必須付出程序執(zhí)行速度降低的代價。下面告訴你一些可以自由支配的記錄集選項。更重要的是,要告訴你從這個選項可以獲得更快的速度還是更多的特征。
1、Snapshot(快照) 這個選項要VisualC++在一次快照中下載整個查詢。換言之,及時快速地給數(shù)據(jù)庫內(nèi)容拍照,并把它作為未來工作的基礎。這種方法有三個缺點。第一,你看不到別人在網(wǎng)絡上做的更新,這可能意味著你的決定是建立在老信息的基礎上。第二,一次就下載所有這些記錄,這意味著在下載期間給網(wǎng)絡增加了沉重的負擔。第三,記錄下載時用戶會結(jié)束等待,這意味著網(wǎng)絡的呼叫性能變得更低。然而這種方法也有兩個優(yōu)點。第一,記錄一旦被下載,該工作站所需的網(wǎng)絡活動幾乎就沒有了棗這為其它請求釋放了帶寬??傊?,你會看到網(wǎng)絡的吞吐量增大了。第二,因為所有被申請的記錄都在用戶的機器上,所以用戶實際上會得到應用程序更佳的總體性能。你可能想把快照的方法限制在較小的數(shù)據(jù)庫上使用,原因在于快照適用于用戶請求信息而不適用于數(shù)據(jù)編輯會話。
2、Dynaset(動態(tài)集)使用這個選項時,VisualC++創(chuàng)建指向所請求的每個記錄的實際指針。另外,只有填充屏幕時實際需要的記錄是從服務器上下載來的。這種方法的好處很明顯。幾乎馬上就能在屏幕上看到記錄。而且還會看到其它用戶對數(shù)據(jù)庫所做的更改。最后,其它用戶也會看到你做的更改,因為動態(tài)集在你更改記錄時被上載到服務器上。很明顯,這種方法要求對服務器的實時訪問,它減小了網(wǎng)絡總吞吐量并降低了應用程序的性能。這個選項適合于創(chuàng)建用戶要花費很多時間來編輯數(shù)據(jù)的應用程序。同時,它也是大型數(shù)據(jù)庫的最佳選擇,原因在于只需下載用戶實際需要的信息。 
3.2    應用ODBC編程
可以應用AppWizard來建立一個ODBC的應用程序框架,也可以直接使用ODBC來進行數(shù)據(jù)庫編程,這時,應包括頭文件afxdb.h。
應用ODBC編程兩個最重要的類是CDatabase和CRecordSet,但在應用程序中,不應直接使用CRecordSet類,而必須從CRecordSet類產(chǎn)生一個導出類,并添加相應于數(shù)據(jù)庫表中字段的成員變量。隨后,重載CRecordset類的成員函數(shù)DoFieldExchange,該函數(shù)通過使用RFX函數(shù)完成數(shù)據(jù)庫字段與記錄集域數(shù)據(jù)成員變量的數(shù)據(jù)交換,RFX函數(shù)同對話框數(shù)據(jù)交換(DDX)機制相類似,負責完成數(shù)據(jù)庫與成員變量間的數(shù)據(jù)交換。

下面舉例說明在VisualC++環(huán)境中ODBC 的編程技巧:
3.21    數(shù)據(jù)庫連接
在CRecordSet類中定義了一個成員變 量m_pDatabase:
CDatabase *m_pDatabase;
它是指向?qū)ο髷?shù)據(jù)庫類的指針。如果在CRecordSet類對象調(diào)用Open()函數(shù)之前,將一個已經(jīng)打開的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 對 象
或如下:

Cdatabase db;
db.Open(“Database”);  //建立ODBC連接
CrecordSet m_set(&db);  //構造記錄集對象,使數(shù)據(jù)庫指向db
3.22    查詢記錄
查詢記錄使用CRecordSet::Open()和CRecordSet::Requery()成員函數(shù)。在使用CRecordSet類對象之前,必須使用CRecordSet::Open()函數(shù)來獲得有效的記錄集。一旦已經(jīng)使用過CRecordSet::Open()函數(shù),再次查詢時就可以應用CRecordSet::Requery()函數(shù)。在調(diào)用CRecordSet::Open()函數(shù)時,如果已經(jīng)將一個已經(jīng)打開的CDatabase對象指針傳給CRecordSet類對象的m_pDatabase成員變量,則使用該數(shù)據(jù)庫對象建立ODBC連接;否則如果m_pDatabase為空指 針,就新建一個CDatabase類對象并使其與缺省的數(shù)據(jù)源相連,然后進行CRecordSet類對象的初始化。缺省數(shù)據(jù)源 由GetDefaultConnect()函數(shù)獲得。你也可以提供你所需要的SQL語句,并以它來調(diào)用CRecordSet::Open()函數(shù),例如:
m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果沒有指定參數(shù),程序則使 用缺省的SQL語句,即對在GetDefaultSQL()函數(shù)中指定的SQL語 句進行操作:

CString CTestRecordSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
對于GetDefaultSQL()函數(shù)返回的表名, 對應的缺省操作是SELECT語句,即:
SELECT * FROM BasicData,MainSize

查詢過程中也可以利用CRecordSet的 成員變量m_strFilter和m_strSort來執(zhí)行條件查詢和結(jié)果排序。m_strFilter為過濾字符串,存放著SQL語句中WHERE后的條件串;m_strSort 為排序字符串,存放著SQL語句中ORDERBY后的字符串。 如:
    m_Set.m_strFilter="TYPE=電動機";
    m_Set.m_strSort="VOLTAGE";
    m_Set.Requery();
    對應的SQL語句為:
    SELECT * FROM BasicData,MainSize
    WHERE TYPE=電動機
    ORDER BY VOLTAGE
除了直接賦值給m_strFilter以外,還 可以使用參數(shù)化。利用參數(shù)化可以更直觀,更方便地 完成條件查詢?nèi)蝿?。使用參?shù)化的步驟如下:

(1).聲明參變量:

    Cstring p1;
    Float p2;
(2).在構造函數(shù)中初始化參變量
    p1=_T("");
    p2=0.0f;
    m_nParams=2;
(3).將參變量與對應列綁定
    pFX->SetFieldType(CFieldExchange::param)
    RFX_Text(pFX,_T("P1"),p1);
    RFX_Single(pFX,_T("P2"),p2);
完成以上步驟之后就可以利用 參變量進行條件查詢了:
    m_pSet->m_strFilter="TYPE=?ANDVOLTAGE=?";
    m_pSet->p1="電動機";
    m_pSet->p2=60.0;
    m_pSet->Requery();
參變量的值按綁定的順序替換 查詢字串中的“?”適配符。
如果查詢的結(jié)果是多條記錄的 話,可以用CRecordSet類的函數(shù)Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來移動光標。
3.23    增加記錄
增加記錄使用AddNew()函數(shù),要求數(shù)據(jù)庫必須是以允許增加的方式打開:

    m_pSet->AddNew();    //在表的末尾增加新記錄
    m_pSet->SetFieldNull(&(m_pSet->m_type),FALSE);    
    m_pSet->m_type="電動機";
        ...            //輸入新的字段值
    m_pSet->    Update();    //將新記錄存入數(shù)據(jù)庫
    m_pSet->Requery();    //重建記錄集
3.24    刪除記錄
直接使用Delete()函數(shù),并且在調(diào)用Delete() 函數(shù)之后不需調(diào)用Update()函數(shù):

    m_pSet->Delete();
    if(!m_pSet->IsEOF())
        m_pSet->MoveNext();
    else
        m_pSet->MoveLast();

3.25    修改記錄
修改記錄使用Edit()函數(shù):

    m_pSet->Edit();        //修改當前記錄
    m_pSet->m_type="發(fā)電機";    //修改當前記錄字段值
        ...
    m_pSet->Update();        //將修改結(jié)果存入數(shù)據(jù)庫
    m_pSet->Requery();
3.26    統(tǒng)計記錄
統(tǒng)計記錄用來統(tǒng)計記錄集的總數(shù)。可以先聲明一個CRecordset對象m_pSet。再綁定一個變量m_lCount,用來統(tǒng)計記錄總數(shù)。執(zhí)行如下語句:
m_pSet->Open(“Select Count(*) from 表名 where 限定條件”);
RecordCount=m_pSet->m_lCount;
m_pSet->Close();
RecordCount即為要統(tǒng)計的記錄數(shù)。
或如下:
CRecordset m_Set(&db);  //db 為CDatabase對象
CString strValue;
m_Set.Open(Select count(*) from 表名 where 限定條件”);
m_pSet.GetFieldValue((int)0,strValue);
long count=atol(strValue);
m_set.Close();
count為記錄總數(shù)。
3.27    執(zhí)行SQL語句
雖然通過CRecordSet類,我們可以完成 大多數(shù)的查詢操作,而且在CRecordSet::Open()函數(shù)中也可以提供SQL語句,但是有的時候我們還想進行一些其他操 作,例如建立新表,刪除表,建立新的字段等等,這時就需要使用到CDatabase類的直接執(zhí)行SQL語句的機制。通過調(diào)用CDatabase::ExecuteSQL()函數(shù)來完成SQL語句的直接執(zhí)行:
如下代碼所示
    BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
    {
        TRY
        {
            m_pdb->ExecuteSQL(strSQL);    //直接執(zhí)行SQL語句
        }
        CATCH (CDBException,e)
        {
            CString strMsg;
            strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
            strMsg+=strSQL;
            return FALSE;
        }
        END_CATCH
        return TRUE;
    }
應當指出的是,由于不同DBMS提 供的數(shù)據(jù)操作語句不盡相同,直接執(zhí)行SQL語句可能會破壞軟件的DBMS無關性,因此在應用中應當慎用此類操作。
3.28    注意
從CRecordSet導出的類中如果包含DataTime類型的數(shù)據(jù),在VC中是用CTime類型來替代的,這時,構造函數(shù)沒有賦于缺省值。這時,我們應當手工賦值。如下所示:
CTime  m_time;
m_time=NULL;
3.3    總結(jié)
VisualC++中的ODBC類庫可以幫助程序員完成絕大多數(shù)的數(shù)據(jù)庫操作。利用ODBC技術使得程序員從具體的DBMS中解脫出來,從而極大的減少了軟件開發(fā)的工作量,縮短開發(fā)周期,提高了效率和軟件的可靠性。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MFC ODBC 用法|非常詳細|正在用(轉(zhuǎn)載)
MFC ODBC 編程
比較VC++數(shù)據(jù)庫開發(fā)的五種技術
MFC的數(shù)據(jù)庫操作
Visual C 數(shù)據(jù)庫編程快速入門
39在 ODBC 中應用DDX 和 RFX
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服