999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2010-05-17 06:04:10張秋波
鐵道勘察 2010年1期
關(guān)鍵詞:設(shè)置數(shù)據(jù)庫

張秋波

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

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

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

圖1 工程菜單

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

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

圖2 設(shè)置菜單

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

圖3 添加與修改

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

圖4 查詢

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

2 實(shí)現(xiàn)步驟

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

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

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

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

創(chuàng)建一個(gè)標(biāo)準(zhǔn)的MFC AppWizard(exe)應(yīng)用程序,然后在使用ADO數(shù)據(jù)庫的InitInstance函數(shù)中初始化OLE/COM庫(因?yàn)锳DO庫是一個(gè)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 表中增加、刪除、修改、查詢操作的實(shí)現(xiàn)

(1)增加

void CAddDlg::OnOK()

{UpdateData();

try

{_variant_t RecordsAffected;

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

{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語句進(jìn)行數(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; //添加記錄的標(biāo)志

dlgadd.DoModal();}

(2)刪除

void CMyDlg::OnButtonDel()

{try

{POSITION pos=m_list.GetFirstSelectedItemPosition();

if(pos)//如果選中一行,則生成動(dòng)態(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); }

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

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

3 結(jié)束語

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

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

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

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

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

本文只是筆者在工作過程中對VC++語言使用過程中的簡單體會(huì)。通過開發(fā)一些小的程序?qū)ξ覀兊墓ぷ鲿?huì)帶來很多方便,能大大提高我們的工作效率。

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

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

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

猜你喜歡
設(shè)置數(shù)據(jù)庫
中隊(duì)崗位該如何設(shè)置
7招教你手動(dòng)設(shè)置參數(shù)
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
本刊欄目設(shè)置說明
中俄臨床醫(yī)學(xué)專業(yè)課程設(shè)置的比較與思考
艦船人員編制的設(shè)置與控制
主站蜘蛛池模板: 国产内射在线观看| 一本大道香蕉高清久久| 蜜桃臀无码内射一区二区三区| 国产精品香蕉在线观看不卡| 亚洲国产高清精品线久久| 91精品国产无线乱码在线| 青青网在线国产| 免费无码网站| 日本少妇又色又爽又高潮| 亚洲国产成人精品青青草原| 午夜小视频在线| 制服丝袜在线视频香蕉| 日本一本在线视频| 亚洲精品无码人妻无码| 久久亚洲美女精品国产精品| 免费午夜无码18禁无码影院| 亚洲人妖在线| 99精品国产自在现线观看| 熟妇人妻无乱码中文字幕真矢织江| 欧美性精品不卡在线观看| 99视频全部免费| 99re热精品视频国产免费| 在线精品亚洲国产| 久久这里只有精品国产99| 亚洲视频无码| 亚洲三级影院| 欧美一级高清片欧美国产欧美| 日本欧美一二三区色视频| 精品三级在线| 国产乱子精品一区二区在线观看| 一级片一区| 国产九九精品视频| 国内精自线i品一区202| 中国丰满人妻无码束缚啪啪| 九色视频一区| 韩国自拍偷自拍亚洲精品| 2021无码专区人妻系列日韩| 韩日免费小视频| 国精品91人妻无码一区二区三区| 视频一本大道香蕉久在线播放| 国产精品毛片一区| 亚洲第一视频网| 丁香婷婷综合激情| 青青草原国产| 欧美不卡在线视频| P尤物久久99国产综合精品| 伊人久久久久久久| 毛片免费在线视频| 国产成人a在线观看视频| 国产凹凸视频在线观看| 精品一區二區久久久久久久網站| 国产视频大全| 精品欧美视频| 97亚洲色综久久精品| 国产精品爽爽va在线无码观看 | 在线永久免费观看的毛片| 一本大道香蕉久中文在线播放| 在线观看欧美国产| 亚洲综合狠狠| 露脸国产精品自产在线播| 国产无码精品在线| 91成人试看福利体验区| 97超级碰碰碰碰精品| 精品一区二区无码av| 伊人久久精品无码麻豆精品| 欧美高清三区| 97人妻精品专区久久久久| 欧美全免费aaaaaa特黄在线| 中文字幕色站| 69视频国产| 在线精品亚洲一区二区古装| 久久香蕉国产线看精品| 亚洲高清无在码在线无弹窗| 毛片网站免费在线观看| 久久黄色视频影| 韩日午夜在线资源一区二区| 免费观看精品视频999| 亚洲国产理论片在线播放| 欧美国产日韩在线观看| 制服丝袜无码每日更新| 人人妻人人澡人人爽欧美一区| 免费激情网址|