vc++中使用ado方式操作access數(shù)據(jù)庫_第1頁
vc++中使用ado方式操作access數(shù)據(jù)庫_第2頁
vc++中使用ado方式操作access數(shù)據(jù)庫_第3頁
vc++中使用ado方式操作access數(shù)據(jù)庫_第4頁
vc++中使用ado方式操作access數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、vc+中使用ado方式操作access數(shù)據(jù)庫 ADO(ActiveX Data Object)是Microsoft數(shù)據(jù)庫應(yīng)用程序開發(fā)的新接口,是建立在OLE DB之上的高層數(shù)據(jù)庫訪問技術(shù),即使你對OLE DB,COM不了解也能輕松對付ADO,因為它非常簡單易用,甚至比你以往所接觸的ODBC API、DAO、RDO都要容易使用,并不失靈活性。本文詳細(xì)地介紹在Visual C+開發(fā)環(huán)境下如何使用ADO來進行數(shù)據(jù)庫應(yīng)用程序開發(fā),并給出示例代碼。為了使讀者朋友都能測試本例提供的代碼,我們采用Access數(shù)據(jù)庫,您可以直接在我們提供的示例代碼中找到這個test.mdb。程序編譯運行后的效果如圖一所示圖一

2、、ADO操作ACESS數(shù)據(jù)庫的界面效果圖一、實現(xiàn)方法萬事開頭難,任何一種新技術(shù)對于初學(xué)者來說最重要的還是入門,掌握其要點。讓我們來看看ADO數(shù)據(jù)庫開發(fā)的基本流程吧!它的基本步驟如下:(1)初始化COM庫,引入ADO庫定義文件(2)用Connection對象連接數(shù)據(jù)庫(3)利用建立好的連接,通過Connection、Command對象執(zhí)行SQL命令,或利用Recordset對象取得結(jié)果記錄集進行查詢、處理。(4)使用完畢后關(guān)閉連接釋放對象。下面我們將詳細(xì)介紹上述步驟并給出相關(guān)代碼。1、COM庫的初始化我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp:InitIn

3、stance()的重載函數(shù)中完成,請看如下代碼:BOOL CADOTest1App:InitInstance()AfxOleInit(); 2、用#import指令引入ADO類型庫為了引入ADO類型庫,需要在項目的stdafx.h文件中加入如下語句:#import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)這一語句有何作用呢?其最終作用同我們已經(jīng)十分熟悉的#include類似,編譯的時候系統(tǒng)會為我們生成msado15.tlh,ado15.tli兩個C+頭文件來定義ADO庫。需要讀

4、者朋友注意的是:您的開發(fā)環(huán)境中msado15.dll不一定在這個目錄下,請按實際情況修改;在編譯的時候可能會出現(xiàn)如下警告,對此微軟在MSDN中作了說明,并建議我們不要理會這個警告:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned。 3、創(chuàng)建Connection對象并連接數(shù)據(jù)庫為了首先我們需要添加一個指向Connection對象的指針_ConnectionPtr m_pConnection,下面的代碼演示了如何創(chuàng)建Connection對象實例

5、及如何連接數(shù)據(jù)庫并進行異常捕捉:BOOL CADOTest1Dlg:OnInitDialog()CDialog:OnInitDialog();HRESULT hr;tryhr = m_pConnection.CreateInstance(ADODB.Connection);/創(chuàng)建Connection對象if(SUCCEEDED(hr)hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb,adModeUnknown);/連接數(shù)據(jù)庫/上面一句中連接字串中的Provider是針對ACCESS2000

6、環(huán)境的,對于ACCESS97,/需要改為:Provider=Microsoft.Jet.OLEDB.3.51;catch(_com_error e)/捕捉異常CString errormessage;errormessage.Format(連接數(shù)據(jù)庫失敗!rn錯誤信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);/顯示錯誤信息 在這段代碼中我們是通過Connection對象的Open方法來進行連接數(shù)據(jù)庫的,下面是該方法的原型:HRESULT Connection15:Open ( _bstr_t ConnectionString, _bstr

7、_t UserID, _bstr_t Password, long Options );上述函數(shù)中參數(shù)ConnectionString為連接字串;參數(shù)UserID是用戶名;參數(shù)Password是登陸密碼;參數(shù)Options是連接選項,用于指定Connection對象對數(shù)據(jù)的更新許可權(quán),一般情況下Options可以是如下幾個常量:adModeUnknown:缺省。當(dāng)前的許可權(quán)未設(shè)置adModeRead:只讀adModeWrite:只寫adModeReadWrite:可以讀寫adModeShareDenyRead:阻止其它Connection對象以讀權(quán)限打開連接adModeShareDenyWri

8、te:阻止其它Connection對象以寫權(quán)限打開連接adModeShareExclusive:阻止其它Connection對象以讀寫權(quán)限打開連接adModeShareDenyNone:阻止其它Connection對象以任何權(quán)限打開連接我們給出一些常用的連接方式供大家參考:(1)通過JET數(shù)據(jù)庫引擎對ACCESS2000數(shù)據(jù)庫的連接:m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:test.mdb,adModeUnknown);(2)通過DSN數(shù)據(jù)源對任何支持ODBC的數(shù)據(jù)庫進行連接:m_pConnection

9、-Open(Data Source=adotest;UID=sa;PWD=;,adModeUnknown);(3)不通過DSN對SQL SERVER數(shù)據(jù)庫進行連接:m_pConnection-Open(driver=SQL Server;Server=;DATABASE=vckbase;UID=sa;PWD=139,adModeUnknown);其中Server是SQL服務(wù)器的名稱,DATABASE是庫的名稱。Connection對象除Open()方法外還有許多方法,我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State。ConnectionTimeO

10、ut用來設(shè)置連接的超時時間,需要在Open之前調(diào)用,例如:m_pConnection-ConnectionTimeout = 5;/設(shè)置超時時間為5秒m_pConnection-Open(Data Source=adotest;,adModeUnknown);State屬性指明當(dāng)前Connection對象的狀態(tài),0表示關(guān)閉,1表示已經(jīng)打開,我們可以通過讀取這個屬性來作相應(yīng)的處理,例如:if(m_pConnection-State)m_pConnection-Close(); /如果已經(jīng)打開了連接則關(guān)閉它4、執(zhí)行SQL命令并取得結(jié)果記錄集為了取得結(jié)果記錄集,我們定義一個指向Recordset對象

11、的指針:_RecordsetPtr m_pRecordset;并為其創(chuàng)建Recordset對象的實例: m_pRecordset.CreateInstance(ADODB.Recordset),SQL命令的執(zhí)行可以采用多種形式,下面我們一一進行闡述。(1)利用Connection對象的Execute方法執(zhí)行SQL命令Execute()方法的原型如下所示:_RecordsetPtr Connection15:Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) 其中CommandText是命令字串,通常是

12、SQL命令。參數(shù)RecordsAffected是操作完成后所影響的行數(shù), 參數(shù)Options表示CommandText中內(nèi)容的類型,Options可以取如下值之一:adCmdText表明CommandText是文本命令;adCmdTable表明CommandText是一個表名;adCmdProc表明CommandText是一個存儲過程;adCmdUnknown表明CommandText內(nèi)容未知。Execute()函數(shù)執(zhí)行完后返回一個指向記錄集的指針,下面我們給出具體代碼并作說明:_variant_t RecordsAffected;/執(zhí)行SQL命令:CREATE TABLE創(chuàng)建表格users,

13、users包含四個字段:整形ID,字符串username,整形old,日期型birthdaym_pConnection-Execute(CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME),&RecordsAffected,adCmdText);/往表格里面添加記錄m_pConnection-Execute(INSERT INTO users(ID,username,old,birthday) VALUES (1, Washington,25,1970/1/1),&RecordsAffected,a

14、dCmdText);/將所有記錄old字段的值加一m_pConnection-Execute(UPDATE users SET old = old+1,&RecordsAffected,adCmdText);/執(zhí)行SQL統(tǒng)計命令得到包含記錄條數(shù)的記錄集m_pRecordset = m_pConnection-Execute(SELECT COUNT(*) FROMusers,&RecordsAffected,adCmdText);_variant_t vIndex = (long)0;_variant_t vCount = m_pRecordset-GetCollect(vIndex);/取得

15、第一個字段的值放入vCount變量m_pRecordset-Close();/關(guān)閉記錄集CString message;message.Format(共有%d條記錄,vCount.lVal);AfxMessageBox(message);/顯示當(dāng)前記錄條數(shù) (2)利用Command對象來執(zhí)行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance(ADODB.Command);_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;/定義為無參數(shù)m_pCom

16、mand-ActiveConnection = m_pConnection;/非常關(guān)鍵的一句,將建立的連接賦值給它m_pCommand-CommandText = SELECT * FROM users;/命令字串m_pRecordset = m_pCommand-Execute(&vNULL,&vNULL,adCmdText);/執(zhí)行命令取得記錄集在這段代碼中我們只是用Command對象來執(zhí)行了SELECT查詢語句,Command對象在進行存儲過程的調(diào)用中能真正體現(xiàn)它的作用。下次我們將詳細(xì)介紹。(3)直接用Recordset對象進行查詢?nèi)〉糜涗浖?,例如:m_pRecordset-Open(S

17、ELECT * FROM users,_variant_t(IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);Open()方法的原型如下:HRESULT Recordset15:Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) 上述函數(shù)中參數(shù)Source是數(shù)據(jù)查

18、詢字符串;參數(shù)ActiveConnection是已經(jīng)建立好的連接(我們需要用Connection對象指針來構(gòu)造一個_variant_t對象);參數(shù)CursorType光標(biāo)類型,它可以是以下值之一;請看這個枚舉結(jié)構(gòu):enum CursorTypeEnumadOpenUnspecified = -1,/不作特別指定adOpenForwardOnly = 0,/前滾靜態(tài)光標(biāo)。這種光標(biāo)只能向前瀏覽記錄集,比如用MoveNext向前滾動,這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset

19、= 1,/采用這種光標(biāo)的記錄集看不到其它用戶的新增、刪除操作,但對于更新原有記錄的操作對你是可見的。adOpenDynamic = 2,/動態(tài)光標(biāo)。所有數(shù)據(jù)庫的操作都會立即在各用戶記錄集上反應(yīng)出來。adOpenStatic = 3/靜態(tài)光標(biāo)。它為你的記錄集產(chǎn)生一個靜態(tài)備份,但其它用戶的新增、刪除、更新操作對你的記錄集來說是不可見的。;參數(shù)LockType表示數(shù)據(jù)庫的鎖定類型,它可以是以下值之一,請看如下枚舉結(jié)構(gòu):enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只讀記錄集adLockPessimistic = 2,悲

20、觀鎖定方式。數(shù)據(jù)在更新時鎖定其它所有動作,這是最安全的鎖定機制adLockOptimistic = 3,樂觀鎖定方式。只有在你調(diào)用Update方法時才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動作adLockBatchOptimistic = 4,樂觀分批更新。編輯時記錄不會鎖定,更改、插入及刪除是在批處理模式下完成。; 參數(shù)Options的含義請參考本文中對Connection對象的Execute()方法的介紹。5、記錄集的遍歷、更新根據(jù)我們剛才通過執(zhí)行SQL命令建立好的users表,它包含四個字段:ID,username,old,birthday以下的代碼實現(xiàn):打開記錄集,遍歷所

21、有記錄,刪除第一條記錄,添加三條記錄,移動光標(biāo)到第二條記錄,更改其年齡數(shù)據(jù),保存到數(shù)據(jù)庫。_variant_t vUsername,vBirthday,vID,vOld;_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(ADODB.Recordset);m_pRecordset-Open(SELECT * FROM users,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);while(!m_pRecordset-ad

22、oEOF)/這里為什么是adoEOF而不是EOF呢?還記得rename(EOF,adoEOF)這一句嗎?vID = m_pRecordset-GetCollect(_variant_t(long)0);/取得第1列的值,從0開始計數(shù),你也可以直接給出列的名稱;vUsername = m_pRecordset-GetCollect(username);/取得username字段的值vOld = m_pRecordset-GetCollect(old);vBirthday = m_pRecordset-GetCollect(birthday);/在DEBUG方式下的OUTPUT窗口輸出記錄集中的記

23、錄if(vID.vt != VT_NULL & vUsername.vt != VT_NULL & vOld.vt != VT_NULL & vBirthday.vt != VT_NULL)TRACE(id:%d,姓名:%s,年齡:%d,生日:%srn,vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);m_pRecordset-MoveNext();/移到下一條記錄m_pRecordset-MoveFirst();/移到首條記錄m_pRecordset-Delete(adAffectCurre

24、nt);/刪除當(dāng)前記錄/添加三條新記錄并賦值for(int i=0;iAddNew();/添加新記錄m_pRecordset-PutCollect(ID,_variant_t(long)(i+10);m_pRecordset-PutCollect(username,_variant_t(葉利欽);m_pRecordset-PutCollect(old,_variant_t(long)71);m_pRecordset-PutCollect(birthday,_variant_t(1930-3-15);m_pRecordset-Move(1,_variant_t(long)adBookmarkFi

25、rst);/從第一條記錄往下移動一條記錄,即移動到第二條記錄處m_pRecordset-PutCollect(_variant_t(old),_variant_t(long)45);/修改其年齡 m_pRecordset-Update();/保存到庫中6、關(guān)閉記錄集與連接記錄集或連接都可以用Close()方法來關(guān)閉:m_pRecordset-Close();/關(guān)閉記錄集m_pConnection-Close();/關(guān)閉連接至此,我想讀者朋友已經(jīng)熟悉了ADO操作數(shù)據(jù)庫的大致流程,也許您已經(jīng)胸有成竹,也許您還有點胡涂,不要緊!建議你嘗試寫幾個例子,這樣會更好地熟悉ADO,最后我給大家寫了一個小例子

26、,例子實現(xiàn)的功能是讀出所有記錄并放到列表控件中,同時可以添加、刪除、修改記錄。二、編程步驟1、 啟動Visual C+6.0,生成一個基于對話框的應(yīng)用程序,將該程序命名為ADOTest1;2、 在對話框界面上放置顯示記錄列表控件和添加、刪除記錄用的的編輯、按鈕控件,具體設(shè)置參加代碼中的對話框資源部分;3、 使用Class Wizard為添加、修改數(shù)據(jù)庫記錄的按鈕添加消息響應(yīng)函數(shù);4、 添加成程序代碼,編譯運行程序。三、程序代碼/ ADOTest1Dlg.h : header file#if !defined(AFX_ADOTEST1DLG_H_29B385C0_02C0_4588_A8B4_D

27、0EFBB4F578D_INCLUDED_)#define AFX_ADOTEST1DLG_H_29B385C0_02C0_4588_A8B4_D0EFBB4F578D_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000class CADOTest1Dlg : public CDialog/ Constructionpublic:BOOL m_bAutoSave;void SaveData();void LoadData();_variant_t vUserID,vUsername,vOld,vBirthday;BOOL m

28、_bSuccess;int m_nCurrentSel;_RecordsetPtr m_pRecordset;CADOTest1Dlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data/AFX_DATA(CADOTest1Dlg)enum IDD = IDD_ADOTEST1_DIALOG ;CButton m_cDelItem;CButton m_cAddItem;CListCtrl m_userlist;UINT m_nUserID;UINT m_nOld;CString m_sUsername;COleDateTime

29、m_tBirthday;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CADOTest1Dlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CADOTest1Dlg)virtual BOOL OnInitD

30、ialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();virtual void OnOK();afx_msg void OnAdditem();afx_msg void OnDelitem();afx_msg void OnItemchangedUserlist(NMHDR* pNMHDR, LRESULT* pResult);/AFX_MSGDECLARE_MESSAGE_MAP();#endif / ADOTest

31、1Dlg.cpp : implementation file#include stdafx.h#include ADOTest1.h#include ADOTest1Dlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifextern CADOTest1App theApp;class CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD

32、_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP(); CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:I

33、DD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()CADOTest1Dlg:CADOTest1Dlg(CWnd* pP

34、arent /*=NULL*/): CDialog(CADOTest1Dlg:IDD, pParent)/AFX_DATA_INIT(CADOTest1Dlg)m_nUserID = 0;m_nOld = 0;m_sUsername = _T();m_tBirthday = COleDateTime:GetCurrentTime();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m

35、_nCurrentSel = -1;m_bSuccess = FALSE;m_bAutoSave = TRUE;void CADOTest1Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CADOTest1Dlg)DDX_Control(pDX, IDC_DELITEM, m_cDelItem);DDX_Control(pDX, IDC_ADDITEM, m_cAddItem);DDX_Control(pDX, IDC_USERLIST, m_userlist);DDX_Text(p

36、DX, IDC_USERID, m_nUserID);DDX_Text(pDX, IDC_OLD, m_nOld);DDX_Text(pDX, IDC_USERNAME, m_sUsername);DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_tBirthday);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CADOTest1Dlg, CDialog)/AFX_MSG_MAP(CADOTest1Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(

37、IDC_ADDITEM, OnAdditem)ON_BN_CLICKED(IDC_DELITEM, OnDelitem)ON_NOTIFY(LVN_ITEMCHANGED, IDC_USERLIST, OnItemchangedUserlist)/AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CADOTest1Dlg:OnInitDialog()CDialog:OnInitDialog();m_cDelItem.EnableWindow(FALSE);:SendMessage(m_userlist.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,L

38、VS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);/為列表控件添加列/m_userlist.InsertColumn(0,用戶ID,LVCFMT_LEFT,60);m_userlist.InsertColumn(1,用戶名,LVCFMT_LEFT,100);m_userlist.InsertColumn(2,年齡,LVCFMT_LEFT,60);m_userlist.InsertColumn(3,生日,LVCFMT_LEFT,100);/讀取數(shù)據(jù)庫中的信息添加到列表控件/int nItem;_variant_t vUsername,vBirthday,vID

39、,vOld;trym_pRecordset.CreateInstance(ADODB.Recordset);m_pRecordset-Open(SELECT*FROM users,_variant_t(IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);m_bSuccess = TRUE;while(!m_pRecordset-adoEOF)vID = m_pRecordset-GetCollect(ID);vUsername = m_pRecordset-GetCollect(usern

40、ame);vOld = m_pRecordset-GetCollect(old);vBirthday = m_pRecordset-GetCollect(birthday);nItem=m_userlist.InsertItem(0 xffff,(_bstr_t)vID);m_userlist.SetItem(nItem,1,1,(_bstr_t)vUsername,NULL,0,0,0);m_userlist.SetItem(nItem,2,1,(_bstr_t)vOld,NULL,0,0,0);m_userlist.SetItem(nItem,3,1,(_bstr_t)vBirthday,

41、NULL,0,0,0);m_pRecordset-MoveNext();catch(_com_error e)/捕捉異常AfxMessageBox(讀取數(shù)據(jù)庫失敗!);/顯示錯誤信息ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FAL

42、SE); / Set small iconreturn TRUE; / return TRUE unless you set the focus to a controlvoid CADOTest1Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CADOTest1Dlg:OnPaint() if (IsIconic()CPaintDC

43、 dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect

44、.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CADOTest1Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CADOTest1Dlg:OnOK() if(m_bSuccess)m_pRecordset-Update();m_pRecordset-Close();CDialog:OnOK();void CADOTest1Dlg:OnAdditem() if(UpdateData()if(

45、m_sUsername.GetLength()0)m_pRecordset-AddNew();m_nCurrentSel = m_userlist.InsertItem(0 xffff,);SaveData();/保存數(shù)據(jù) m_userlist.SetItemState(m_nCurrentSel,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);m_userlist.SetHotItem(m_nCurrentSel);m_userlist.SetFocus();elseAfxMessageBox(請輸入用戶名);void CADOT

46、est1Dlg:OnDelitem() m_bAutoSave = FALSE;if(m_nCurrentSel = 0)m_userlist.DeleteItem(m_nCurrentSel);int count = m_userlist.GetItemCount();if(count Delete(adAffectCurrent);m_pRecordset-MoveNext();LoadData();m_userlist.SetItemState(m_nCurrentSel,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);m_u

47、serlist.SetFocus();m_bAutoSave = TRUE;/在選擇列表框的時候調(diào)用/void CADOTest1Dlg:OnItemchangedUserlist(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;if(pNMListView-uNewState&LVIS_SELECTED)UpdateData();SaveData();/保存舊數(shù)據(jù)m_nCurrentSel = pNMListView-iItem;LoadData();/加載新數(shù)據(jù)m_cDelIt

48、em.EnableWindow();*pResult = 0;/將記錄集中的數(shù)據(jù)加載到編輯框/void CADOTest1Dlg:LoadData()m_pRecordset-Move(m_nCurrentSel,_variant_t(long)adBookmarkFirst);vUserID = m_pRecordset-GetCollect(ID);vUsername = m_pRecordset-GetCollect(username);vOld = m_pRecordset-GetCollect(old);vBirthday = m_pRecordset-GetCollect(birt

49、hday);m_nUserID = vUserID.lVal;m_sUsername = (LPCTSTR)(_bstr_t)vUsername;m_nOld = vOld.lVal;m_tBirthday = vBirthday;UpdateData(FALSE);/將編輯框的數(shù)據(jù)保存到記錄集與列表框void CADOTest1Dlg:SaveData()if(!m_pRecordset-adoEOF & m_nCurrentSel = 0 & m_bAutoSave)vUserID = (long)m_nUserID;vUsername = m_sUsername;vOld = (long

50、)m_nOld;vBirthday = m_tBirthday;m_pRecordset-PutCollect(ID,vUserID);m_pRecordset-PutCollect(username,vUsername);m_pRecordset-PutCollect(old,vOld);m_pRecordset-PutCollect(birthday,vBirthday);_userlist.SetItem(m_nCurrentSel,0,LVIF_TEXT,(_bstr_t)vUserID,NULL,0,0,0);m_userlist.SetItem(m_nCurrentSel,1,LV

51、IF_TEXT,(_bstr_t)vUsername,NULL,0,0,0);m_userlist.SetItem(m_nCurrentSel,2,LVIF_TEXT,(_bstr_t)vOld,NULL,0,0,0);m_userlist.SetItem(m_nCurrentSel,3,LVIF_TEXT,(_bstr_t)vBirthday,NULL,0,0,0);/BOOL CADOTest1App:InitInstance()AfxEnableControlContainer();AfxOleInit();/初始化COM庫HRESULT hr; /連接數(shù)據(jù)庫/tryhr = m_pCo

52、nnection.CreateInstance(ADODB.Connection);/創(chuàng)建Connection對象if(SUCCEEDED(hr)hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb,adModeUnknown);/連接數(shù)據(jù)庫/上面一句中連接字串中的Provider是針對ACCESS2000環(huán)境的,/對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51; catch(_com_error e)/捕捉異常CString errorme

53、ssage;errormessage.Format(連接數(shù)據(jù)庫失敗!rn錯誤信息:%s,e.ErrorMessage();AfxMessageBox(errormessage);/顯示錯誤信息return FALSE; #ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); / Call this when linking to MFC statically#endifCADOTest1Dlg dlg;m_pMainWnd = &dlg;

54、int nResponse = dlg.DoModal();if (nResponse = IDOK)else if (nResponse = IDCANCEL)return FALSE;/int CADOTest1App:ExitInstance() if(m_pConnection-State)m_pConnection-Close(); /如果已經(jīng)打開了連接則關(guān)閉它return CWinApp:ExitInstance();四、小結(jié)限于篇幅ADO中的許多內(nèi)容還沒有介紹,如綁定方式處理記錄集數(shù)據(jù)、存儲過程的調(diào)用、事務(wù)處理、圖象在數(shù)據(jù)庫中的保存與讀取、與表格控件的配合使用等。如果讀者對上述內(nèi)

55、容感性認(rèn)識的話,可以自行參考相關(guān)編程資料。CListCtrl基本用法CListCtrl是列表控件類,列表控件的每一行叫做一個item,每一列叫做一個subitem。每一行和每一列都有個ID號,可以確定唯一的單元格。最近使用了這個控件,有心得總結(jié)如下:(Dialog模式)1. 創(chuàng)建列表控件.定義一個成員變量:CListCtrl *m_pListCtrl;在初始化對話框的時候創(chuàng)建列表,也就是在OnInitDialog()中創(chuàng)建(在哪里創(chuàng)建沒有規(guī)定,只要符合對象和資源創(chuàng)建的規(guī)則即可。)m_pListCtrl=new CListCtrl();m_pListCtrl-Create();m_pListCt

56、rl-SetExtendedStyle();Create函數(shù)有四個參數(shù),DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID 。第一個參數(shù)可以是一些值的組合,用來定義列表的樣式,這些值MSDN有詳細(xì)說明,我只舉一個簡單的例子,更多的查看MSDN。例如第一個參數(shù)使用LVS_REPORT,則表示列表有標(biāo)題,或者說有列頭,很多其他的樣式必須是和這個樣式搭配使用才有效。第二個參數(shù)是列表的坐標(biāo)和大小,這個矩形框就表示列表的矩形框。第三個參數(shù)表示這個列表的父類,如果列表在對話框上或者是在試圖上,這個參數(shù)可以是this。第四個參數(shù)是列表的資源

57、號。SetExtendedStyle函數(shù)只有一個參數(shù),是一些值的組合,用來設(shè)置列表的擴展樣式,這些值MSDN有詳細(xì)的說明,我只介紹兩個比較常用的。 LVS_EX_GRIDLINES :列表顯示網(wǎng)格,只適用于LVS_REPORT 風(fēng)格。LVS_EX_FULLROWSELECT:當(dāng)一個item被選中時,它的所有subitems也處于被選中狀態(tài),點擊任意一個subitem,則可同時選中整個行.只適用于LVS_REPORT 風(fēng)格。2.構(gòu)建列表 構(gòu)建列表也就是兩個操作,插入列和插入行,前面說過,一個列就是一個subitem,一行就是一個item。m_pListCtrl-InsertColumn(0,第一

58、列);列索引從0開始,InsertColumn函數(shù)將在列表中建立一個列,如果數(shù)據(jù)有三列,就調(diào)用三次此函數(shù),索引分別是0,1,2。m_pListCtrl-InsertItem(0,第一行);行索引也從0開始,InsertItem函數(shù)在列表中建立一行,且“第一行”的字樣顯示在的一列中,其他各列為空,如果要在除第一列以外的列中插入數(shù)據(jù),調(diào)用SetItemText()函數(shù),這個函數(shù)有三個參數(shù),第一個參數(shù)表示要在第幾行插入,第二個參數(shù)表示要在第幾列插入,第三個參數(shù)表示要插入的內(nèi)容??梢栽O(shè)定列寬:LVCOLUMN lvcolumn;m_pListCtrl-GetColumn(0,&lvcolumn);lv

59、column.mask=LVCF_WIDTH;lvcolumn.cx=335;m_pListCtrl-SetColumn(0,&lvcolumn);表示將列寬設(shè)定為335像素。3.操作列表這里主要介紹一個比較有用的函數(shù)SubItemHitTest()當(dāng)鼠標(biāo)停留在列表框上時,此函數(shù)會返回鼠標(biāo)所在的行號,和鼠標(biāo)所在的列號。LVHITTESTINFO linfo;DWORD dwPos = GetMessagePos();CPoint point(LOWORD(dwPos),HIWORD(dwPos);m_pListCtrl-ScreenToClient(&point);linfo.pt=point

60、;linfo.flags=LVHT_ABOVE;int iItem=m_pListCtrl-SubItemHitTest(&linfo);行號保存在linfo.iItem中,列號保存在linfo.iSubItem中,此時可以調(diào)用GetItemText()函數(shù)獲得這個單元格的內(nèi)容了。這個方法常用在列表的NM_CLICK和NM_DBLCLK事件中。此類消息為:ON_NOTIFY(NM_CLICK, IDC, OnFun)函數(shù)原型:void OnFun(NMHDR *pNMHDR, LRESULT *pResult)*pResult = 0;4.列表中的CheckBox列表有多中風(fēng)格,帶CheckB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論