亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        淺談利用VC++對數(shù)據(jù)庫的開發(fā)

        2010-05-17 06:04:10張秋波
        鐵道勘察 2010年1期
        關(guān)鍵詞:對話框語句應用程序

        張秋波

        (中鐵工程設(shè)計咨詢集團有限公司濟南設(shè)計院, 山東濟南 250022)

        1 開發(fā)環(huán)境的建立

        使用AppWizard來創(chuàng)建MFC工程(選擇工程→新建→工程菜單,這時彈出創(chuàng)建向?qū)υ捒?如圖1)),工程命名為“張秋波”。

        圖1 工程菜單

        在Step1中選擇D基本對話框然后單擊完成。

        (1)在主對話框中設(shè)置其ID: IDD_MY_DIALOG,在工具的控制面板上選擇List Control主對話框中拖出一個方框,點擊右鍵選擇Properties,設(shè)置其ID: IDC_LIST,并利用Class Wizard(類向?qū)?設(shè)置member variable name(變量名)為“m_list”并添加相應的函數(shù)OnDblclkList、OnRclickList。然后利用工具的控制面板中的Button創(chuàng)建四個按鈕,標題分別為:添加、修改、刪除、查詢,ID分別為:IDC_BUTTON_ADD、IDC_BUTTON_EDIT、IDC_BUTTON_DEL、IDC_BUTTON_SEARCH,并添加相應函數(shù):OnButtonAdd、OnButtonDel、OnButtonEdit、OnButtonSearch。最后設(shè)置結(jié)果如圖2所示。

        圖2 設(shè)置菜單

        (2)在Dialog中再添加一個對話框(即設(shè)置新類),設(shè)置其ID為:IDD_DIALOG_ADD,標題為:添加/修改記錄,其類名為CAddDlg,用于查詢操作。在對話框上分別設(shè)置查詢窗口:名稱分別為:CategoryID:、CategoryName:、Description:、Picture:,輸入窗口分別為:IDC_CategoryID、IDC_CategoryName、IDC_Description、IDC_Picture,其對應的變量名分別為:m_categoryid、m_categoryname、m_description,最后設(shè)置結(jié)果如圖3。

        圖3 添加與修改

        (3)在Dialog中再添加一個用于查詢操作的對話框,方法同上兩步,分別設(shè)置其ID、函數(shù)、變量名。鑒于篇幅這里不再贅述,最后設(shè)置結(jié)果如圖4。

        圖4 查詢

        上面三步簡單介紹了環(huán)境的建立過程(這里只介紹了一些主要操作的建立過程),下面介紹這些功能的實現(xiàn)過程。

        2 實現(xiàn)步驟

        2.1 鏈接數(shù)據(jù)庫

        (1)引入ADO庫文件使用預處理指令#import

        代碼如下:#import "C:Program Filescommon filessystemadomsado15.dll" no_namespace rename("EOF","EndOfFile")要注意不能放在stdAfx.h文件的開頭,而應該放在所有include指令的后面。否則在編譯時會出錯。程序在編譯過程中,VC++會讀出msado15.dll中的類型庫信息,自動產(chǎn)生兩個該類型庫的頭文件和實現(xiàn)文件msado15.tlh和msado15.tli(在您的Debug或Release目錄下)。在這兩個文件里定義了ADO的所有對象和方法,以及一些枚舉型的常量等。我們的程序只要直接調(diào)用這些方法就行了。

        (2)生成應用程序框架并初始化OLE/COM庫環(huán)境

        創(chuàng)建一個標準的MFC AppWizard(exe)應用程序,然后在使用ADO數(shù)據(jù)庫的InitInstance函數(shù)中初始化OLE/COM庫(因為ADO庫是一個COM DLL庫)。代碼如下:

        BOOL CMyDlg::OnInitDialog()

        {::CoInitialize(NULL); //初始化OLE/COM庫環(huán)境

        CDialog::OnInitDialog();

        ASSERT((IDM_ABOUTBOX & 0xFFF0)=IDM_ABOUTBOX);

        ASSERT(IDM_ABOUTBOX<0xF000);

        CMenu*pSysMenu=GetSystemMenu(FALSE);

        if (pSysMenu !=NULL)

        {CString strAboutMenu;

        strAboutMenu.LoadString(IDS_ABOUTBOX);

        if (!strAboutMenu.IsEmpty())

        {pSysMenu->AppendMenu(MF_SEPARATOR);

        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}

        SetIcon(m_hIcon, TRUE);

        SetIcon(m_hIcon, FALSE);

        m_font1.CreateFont(12, 0,0,0,FW_BOLD, 0,0,0,

        DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,

        DEFAULT_QUALITY, DEFAULT_PITCH |FF_DONTCARE, "宋體");

        m_imagelist.Create(16,16,TRUE,2,2);

        m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_YES));

        m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_NO));

        m_list.SetImageList(&m_imagelist,LVSIL_SMALL);

        m_list.SetExtendedStyle(0x21);

        m_list.GetHeaderCtrl()->SetFont(&m_font1);

        m_list.SetBkColor(RGB(247,247,255));

        m_list.SetTextColor(RGB(0,0,255));

        m_list.SetTextBkColor(RGB(247,247,255));

        m_list.InsertColumn(0,"CategoryID",LVCFMT_LEFT,120);

        m_list.InsertColumn(1,"CategoryName",LVCFMT_CENTER,170);

        m_list.InsertColumn(2,"Description",LVCFMT_CENTER,170);

        m_list.InsertColumn(3,"Picture",LVCFMT_CENTER,150);

        List("SELECT*FROM Categories");//顯示此用戶的數(shù)據(jù)

        return TRUE;}

        void CMyDlg::List(CString sql)//將SQL語句查詢的結(jié)果顯示在列表框中

        {int nItem=0;

        m_list.DeleteAllItems();

        m_pRecordset.CreateInstance(_uuidof(Recordset));//初始化Recordset指針

        try

        {m_pRecordset->Open((_variant_t)sql,(IDispatch*)theApp.m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);

        while(!m_pRecordset->EndOfFile)//遍歷所有記錄

        {if(!m_pRecordset->EndOfFile)

        {nItem=m_list.InsertItem(0xffff,(char*)_bstr_t(m_pRecordset->GetCollect("CategoryID")));

        m_list.SetItemText(nItem,0,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("CategoryID"));

        m_list.SetItemText(nItem,1,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("CategoryName"));

        m_list.SetItemText(nItem,2,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Description"));

        m_list.SetItemText(nItem,3,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Picture"));}

        m_pRecordset->MoveNext();//轉(zhuǎn)到下一條記錄}

        m_pRecordset->Close();

        m_pRecordset=NULL;}

        catch (_com_error e)//異常處理

        {AfxMessageBox(e.ErrorMessage());}}

        BOOL CMyDlg::DestroyWindow()

        {::CoUninitialize();

        return CDialog::DestroyWindow();}

        2.2 表中增加、刪除、修改、查詢操作的實現(xiàn)

        (1)增加

        void CAddDlg::OnOK()

        {UpdateData();

        try

        {_variant_t RecordsAffected;

        if(!m_bAddOrModify)//如果是添加記錄的話就執(zhí)行SQL語句進行添加

        {theApp.m_strSQL="INSERT INTO Categories

        (CategoryName, Description, Picture) values('"+m_categoryname+"','"+m_description+"','"+m_picture+"')";

        theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);

        UpdateData(false);}

        else //如果是修改記錄的話就執(zhí)行SQL語句進行數(shù)據(jù)庫的更新

        {UpdateData();

        theApp.m_strSQL="update Categories set CategoryName='"+m_categoryname+

        "',Description='"+m_description+"',Picture='"+m_picture+"' where Category

        ID='"+m_strFlag+"'";

        _variant_t RecordsAffected;

        theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);}

        ((CMyDlg*)AfxGetMainWnd())->List("SELECT * FROM Categories");; //更新列表框的顯示

        CDialog::OnOK();}

        catch(_com_error e)

        {AfxMessageBox(e.ErrorMessage());}}

        BOOL CAddDlg::OnInitDialog()

        {CDialog::OnInitDialog();

        theApp.m_strSQL="select * from

        Categories where CategoryID='"+m_categoryid+"' and

        CategoryName='"+m_categoryname+"' and

        Description='"+m_description+"' and

        Picture='"+m_picture+"'";

        _RecordsetPtr m_pRecordset;

        switch(this->m_bAddOrModify) //根據(jù)主窗口轉(zhuǎn)來的數(shù)據(jù)判斷是否是添加記錄還是修改。

        {case 0:

        SetWindowText("添加記錄");

        break;

        case 1:

        SetWindowText("修改記錄");

        try

        {m_pRecordset.CreateInstance(_uuidof(Recordset));

        m_pRecordset->Open((_variant_t)theApp.m_strSQL,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

        if(!m_pRecordset->EndOfFile)

        {m_strFlag=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Flag");}

        m_pRecordset->Close();}

        catch(_com_error e)///捕捉異常

        {AfxMessageBox(e.ErrorMessage());}

        break;}

        return TRUE; }

        #include "AddDlg.h"

        void CMyDlg::OnButtonAdd()

        {CAddDlg dlgadd;

        dlgadd.m_bAddOrModify=0; //添加記錄的標志

        dlgadd.DoModal();}

        (2)刪除

        void CMyDlg::OnButtonDel()

        {try

        {POSITION pos=m_list.GetFirstSelectedItemPosition();

        if(pos)//如果選中一行,則生成動態(tài)的sql語句

        {int nItem=m_list.GetNextSelectedItem(pos);

        theApp.m_strSQL="DELETE FROM [Order Details] WHERE ProductID in (select ProductID from Products where CategoryID='"+m_list.GetItemText(nItem,0)+"') DELETE FROM Products WHERE CategoryID='"+m_list.GetItemText(nItem,0)+"' DELETE FROM Categories WHERE CategoryID='"+m_list.GetItemText(nItem,0)+"' and CategoryName='"+m_list.GetItemText(nItem,1)+"' and Description like '"+m_list.GetItemText(nItem,2)+"'";

        _variant_t RecordsAffected;

        theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);//執(zhí)行此sql語句

        List("SELECT * FROM Categories");}}

        else

        AfxMessageBox("請選擇一行數(shù)據(jù)!");}

        catch(_com_error e)

        {AfxMessageBox(e.ErrorMessage());}}

        (3)修改

        void CMyDlg::OnButtonEdit()

        {POSITION pos=m_list.GetFirstSelectedItemPosition();

        if(pos)//如果選中一行

        {int nItem=m_list.GetNextSelectedItem(pos);

        CAddDlg dlgadd;

        dlgadd.m_bAddOrModify=1; //修改

        dlgadd.m_categoryid=m_list.GetItemText(nItem,0);

        dlgadd.m_strFlag=m_list.GetItemText(nItem,0);

        dlgadd.m_categoryname=m_list.GetItemText(nItem,1);

        dlgadd.m_description=m_list.GetItemText(nItem,2);

        dlgadd.m_picture=m_list.GetItemText(nItem,3);

        dlgadd.DoModal();} }

        (4)查詢

        #include "SearchDlg.h"

        void CMyDlg::OnButtonSearch()

        {CSearchDlg sd;

        sd.DoModal();}

        void CMyDlg::OnRadio4()

        {UpdateData();

        switch(m_radio)

        {case 0:

        theApp.m_strSQL="SELECT * FROM Categories";

        break;

        case 1:

        theApp.m_strSQL="SELECT * FROM Categories WHERE YorN='N'";

        break;

        case 2:

        heApp.m_strSQL="SELECT * FROM Categories WHERE YorN='Y'";

        break;}

        List(theApp.m_strSQL); }

        最終運行結(jié)果如圖5所示。

        注:在操作過程中要注意備份數(shù)據(jù)庫中的數(shù)據(jù)。

        3 結(jié)束語

        ADO模型包含了連接對象、命令對象、域?qū)ο?、參?shù)對象、記錄集對象、錯誤對象等。對象之間又具有層次關(guān)系。在VC++中使用ADO訪問數(shù)據(jù)庫基本過程是:初始化COM庫,引入ADO庫文件,用Connection對象連接數(shù)據(jù)庫,利用建立好的連接,通過利用Recordset對象取得結(jié)果記錄集進行查詢、處理。使用完畢后關(guān)閉連接釋放對象。封裝的ADO類應包括以下函數(shù)和數(shù)據(jù)結(jié)構(gòu):

        (1)建立數(shù)據(jù)庫連接函數(shù);ADO連接數(shù)據(jù)庫首先要用到Connection對象,它是到數(shù)據(jù)庫的物理連接,管理著應用程序和數(shù)據(jù)庫之間的通訊。對于大多數(shù)的數(shù)據(jù)庫系統(tǒng),每一個物理連接都需要耗費大量系統(tǒng)內(nèi)存,是寶貴的系統(tǒng)資源,不可濫用??紤]到應用程序的效率,每一個數(shù)據(jù)庫客戶端都只用一個物理連接,并且應用程序結(jié)束后應該釋放。

        (2)關(guān)閉數(shù)據(jù)庫連接函數(shù)。

        (3)SQL查詢語句函數(shù)Select();記錄集的建立和查詢結(jié)果得獲取是影響應用程序得效率得關(guān)鍵問題。由于每一次查詢結(jié)果都可能不一樣,所以每個查詢語句都要建立一個記錄集對象。

        (4)執(zhí)行無返回結(jié)果的SQL語句函數(shù)Excute();實現(xiàn)對數(shù)據(jù)庫的連接以及對數(shù)據(jù)庫中表的增加、刪除、修改、查詢等基本操作。

        本文只是筆者在工作過程中對VC++語言使用過程中的簡單體會。通過開發(fā)一些小的程序?qū)ξ覀兊墓ぷ鲿砗芏喾奖?能大大提高我們的工作效率。

        [1] 韓 鵬.地理信息系統(tǒng)開發(fā)——MapObjects方法[M].武漢:武漢大學出版社,2004

        [2] 劉 光.地理信息系統(tǒng)——組件開發(fā)篇[M].北京:中國電力出版社,2003

        [3] 呂丹陽,等.Visual C++.NET數(shù)據(jù)庫開發(fā)指南[M].北京:清華大學出版社,2002

        猜你喜歡
        對話框語句應用程序
        重點:語句銜接
        正?;謴吞摂M機
        刪除Win10中自帶的應用程序
        電腦報(2019年12期)2019-09-10 05:08:20
        Bootlace Worms’Secret etc.
        中學科技(2018年12期)2018-12-19 11:22:28
        精彩語句
        如何搞定語句銜接題
        語文知識(2014年4期)2014-02-28 21:59:52
        快速抓取對話框中的完整信息
        電腦迷(2012年22期)2012-04-29 20:30:54
        關(guān)閉應用程序更新提醒
        電腦迷(2012年15期)2012-04-29 17:09:47
        三星電子將開設(shè)應用程序下載商店
        作文語句實錄
        男人的天堂av高清在线| 国产日产综合| 国产亚洲精品aaaa片小说| 国产精品揄拍100视频| 国产粉嫩高清| 完整在线视频免费黄片| 日韩伦理av一区二区三区| 亚洲国产精品成人av在线不卡| 青青草小视频在线播放| 欧美不卡一区二区三区| 成年女人粗暴毛片免费观看| 国产免费av片在线播放| 品色堂永远的免费论坛| 久久久久无码精品国| 亚洲乱码av中文一区二区第八页| 久久日日躁夜夜躁狠狠躁| 成人国产精品一区二区网站公司| 最新亚洲精品国偷自产在线| 久久99久久99精品免观看女同| 美国又粗又长久久性黄大片| 黄射视频在线观看免费| 东京热无码av一区二区| 天天爽天天爽天天爽| 欧美日韩国产成人综合在线影院| 日本中文字幕一区二区视频| 日本精品极品视频在线| 亚洲美女主播内射在线| 新婚少妇无套内谢国语播放| 国产在线精品一区在线观看| 精品一区二区av天堂| 国产成人丝袜在线无码| 日本精品人妻一区二区| 久久精品99国产精品日本| 成人a级视频在线观看| 欧美刺激午夜性久久久久久久| 亚洲中文字幕在线精品2021| 狼狼色丁香久久女婷婷综合| 国产精品一区二区av麻豆日韩| 男女性杂交内射女bbwxz| 天堂√在线中文官网在线| 亚洲乱亚洲乱少妇无码99p|