MFC下使用ADO连接数据库_第1页
MFC下使用ADO连接数据库_第2页
MFC下使用ADO连接数据库_第3页
MFC下使用ADO连接数据库_第4页
MFC下使用ADO连接数据库_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MFC下使用ADO读写Access数据库实例 TOC o 1-3 h z u HYPERLINK l _Toc293783795 一、原型系统描述 PAGEREF _Toc293783795 h 2 HYPERLINK l _Toc293783796 二、数据库表设计 PAGEREF _Toc293783796 h 2 HYPERLINK l _Toc293783797 三、数据库编程 PAGEREF _Toc293783797 h 2 HYPERLINK l _Toc293783798 1.新建MFC基于对话框项目 PAGEREF _Toc293783798 h 2 HYPERLINK l

2、_Toc293783799 2.用#import指令引入ADO类型库 PAGEREF _Toc293783799 h 2 HYPERLINK l _Toc293783800 3.创建数据库操作类CADODatabase PAGEREF _Toc293783800 h 3 HYPERLINK l _Toc293783801 3.1为CADODatabase添加两个成员变量 PAGEREF _Toc293783801 h 3 HYPERLINK l _Toc293783802 3.2添加OpenDatabase函数 PAGEREF _Toc293783802 h 3 HYPERLINK l _To

3、c293783803 3.3添加CloseDatabase函数 PAGEREF _Toc293783803 h 4 HYPERLINK l _Toc293783804 3.4添加Select函数 PAGEREF _Toc293783804 h 5 HYPERLINK l _Toc293783805 3.5添加Execute函数 PAGEREF _Toc293783805 h 6 HYPERLINK l _Toc293783806 四、MFC界面编程 PAGEREF _Toc293783806 h 6 HYPERLINK l _Toc293783807 1.在对话框中添加控件 PAGEREF _

4、Toc293783807 h 6 HYPERLINK l _Toc293783808 2.在程序启动时初始化列表框,并连接数据库 PAGEREF _Toc293783808 h 7 HYPERLINK l _Toc293783809 2.1初始化列表框 PAGEREF _Toc293783809 h 7 HYPERLINK l _Toc293783810 2.2连接数据库 PAGEREF _Toc293783810 h 7 HYPERLINK l _Toc293783811 3.添加查询功能 PAGEREF _Toc293783811 h 8 HYPERLINK l _Toc293783812

5、 4.添加新增记录功能 PAGEREF _Toc293783812 h 9 HYPERLINK l _Toc293783813 五、使用Datagrid ActiveX控件 PAGEREF _Toc293783813 h 10 HYPERLINK l _Toc293783814 1.添加Datagrid控件 PAGEREF _Toc293783814 h 10 HYPERLINK l _Toc293783815 2.创建数据库 PAGEREF _Toc293783815 h 11 HYPERLINK l _Toc293783816 3.创建数据库操作类CADODatabase PAGEREF

6、_Toc293783816 h 12 HYPERLINK l _Toc293783817 4.使用Datagrid PAGEREF _Toc293783817 h 12 HYPERLINK l _Toc293783818 4.1 绑定数据源 PAGEREF _Toc293783818 h 12 HYPERLINK l _Toc293783819 4.2 添加记录 PAGEREF _Toc293783819 h 13说明:本文以“学生信息管理”系统雏形为例子,介绍在MFC下如何使用ADO连接数据库编程,并给出示例代码。下面内容第一至四节介绍如何采用ADO连接数据库、关闭数据、执行sql语句及如何

7、用另一种方式执行常用的select语句。第五节介绍如何使用Datagrid控件:建立_RecordsetPtr对象与Datagrid控件之间的绑定,通过改变_RecordsetPtr对象的内容更新数据库表的记录。第一至四节的内容请参考代码“CtrlListDatabase.rar”,第五节内容请参考“Datagrid.rar”请同学们结合ADO.NET课程内容自主学习,将所学到的技术应用到项目实训中。原型系统描述本程序为一个学生信息管理系统雏形。程序界面如下图左图所示。用户在姓名栏输入查询字段,列表框中列出查询结果。如下图右图所示。用户点击新增记录按钮新增学生信息记录。数据库表设计建立Acce

8、ss文件test.mdb,创建student表,表中字段名称、数据类型及各字段的说明设置如下数据库编程新建MFC基于对话框项目新建MFC基于对话框项目。本例中对项目命名为CtrlListDatabase。用#import指令引入ADO类型库为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:#import C:Program FilesCommon FilesSystemadomsado15.dll no_namespace rename(EOF, adoEOF)注意添加的位置在#endif /_AFX_NO_AFXCMN_SUPPORT之后创建数据库操作类CADODatab

9、ase为CADODatabase添加两个成员变量_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;其中m_pConnection是一个指向Connection对象的指针,通过它来连接数据库。m_pRecordset是一个指向记录集合的指针,从数据库查询得到的结果放在m_pRecordset中。添加OpenDatabase函数功能:连接数据库输入:数据库连接串strConnection(其含义见第四部分第二步中2.2的解释)输出:TRUE,如果成功连接数据库,FALSE,如果连接数据库失败BOOL CADODatabase:OpenD

10、atabase(CString strConection)HRESULT hr = :CoInitialize(NULL); / 初始化COMif (!SUCCEEDED(hr) / 初始化失败return FALSE;_bstr_t strConnect(strConection);try/ 创建Connection对象hr = m_pConnection.CreateInstance(ADODB.Connection);if (SUCCEEDED(hr)/ 连接数据库if (SUCCEEDED(m_pConnection-Open(strConnect, , , adModeUnknown

11、)return TRUE;catch (_com_error e)TRACE(_T(连接数据库发生错误%sn), e.ErrorMessage();return FALSE;上述代码中,通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型:HRESULT Connection15:Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options );上述函数中参数ConnectionString为连接字串;参数UserID是用户名;参数Password是登陆密码;在本例子中

12、,数据库的用户名和密码均没创建,所以去空值”。参数Options是连接选项,用于指定Connection对象对数据的更新许可权,一般情况下Options可以是如下几个常量:adModeUnknown缺省。当前的许可权未设置adModeRead只读adModeWrite只写adModeReadWrite可以读写adModeShareDenyRead阻止其它Connection对象以读权限打开连接adModeShareDenyWrite阻止其它Connection对象以写权限打开连接adModeShareExclusive阻止其它Connection对象以读写权限打开连接adModeShareDe

13、nyNone阻止其它Connection对象以任何权限打开连接添加CloseDatabase函数功能:关闭数据库连接返回:TRUE,如果成功关闭,否则FALSE。BOOL CADODatabase:CloseDatabase()if (m_pConnection = NULL)/ 如果连接已经为空return TRUE;trym_pConnection-Close();m_pConnection = NULL;return TRUE;catch (_com_error e)TRACE(_T(关闭数据库发生错误:%sn), e.ErrorMessage();return FALSE;添加Sele

14、ct函数功能:返回查询结果输入:查询语句字符串sql输出:查询结果集合方法一:直接用Recordset对象进行查询取得记录集_RecordsetPtr CADODatabase:Select(CString sql)_bstr_t CommandText(sql); / 生成要执行的sql语句字符串m_pRecordset.CreateInstance(ADODB.Recordset); / 生成_RecordsetPtr实例m_pRecordset-Open(CommandText, / 连接数据库查询m_pConnection.GetInterfacePtr(),adOpenDynamic

15、,adLockBatchOptimistic,adCmdText);return m_pRecordset;其中Open方法原型如下:HRESULT Recordset15:Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )上述函数中参数Source是数据查询字符串;参数ActiveConnection是已经建立好的连接(我们需要用Connection对象指

16、针来构造一个_variant_t对象);参数CursorType光标类型,它可以是以下值之一;请看这个枚举结构:enum CursorTypeEnumadOpenUnspecified = -1,/不作特别指定adOpenForwardOnly = 0,/前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,/采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。a

17、dOpenDynamic = 2,/动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。adOpenStatic = 3/静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。;参数LockType表示数据库的锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只读记录集adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3

18、,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。;方法二:利用Command对象来执行SQL命令_RecordsetPtr CADODatabase:Select(CString sql)_CommandPtr m_pCommand;m_pCommand.CreateInstance(ADODB.Command);_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = D

19、ISP_E_PARAMNOTFOUND; /定义为无参数m_pCommand-ActiveConnection = m_pConnection; /非常关键的一句,将建立的连接赋值给它m_pCommand-CommandText = SELECT * FROM users; /命令字串m_pRecordset = m_pCommand-Execute(&vNULL,&vNULL,adCmdText);return m_pRecordset;添加Execute函数功能:执行sql语句(例如Insert、Update操作等)输入:sql语句字符串返回值:TRUE,如果成功执行。BOOL CADOD

20、atabase:Execute(CString sql)_bstr_t CommandText(sql);_variant_t RecordsAffected;m_pConnection-Execute(CommandText, &RecordsAffected, adCmdText);return TRUE;MFC界面编程在对话框中添加控件控件ID关联变量类型关联变量说明编辑框IDC_EDIT_NAMECStringm_strQueryName查询姓名编辑框列表控件IDC_LIST_STUDENT_INFOCListCtrlm_listCtrl查询记录列表狂将列表框控件的View属性(在St

21、yle选项卡下)设置为Report在程序启动时初始化列表框,并连接数据库在CCtrlListDatabaseDlg:OnInitDialog()函数中添加两部分代码:初始化列表框m_ListCtrl.SetExtendedStyle(LVS_EX_HEADERDRAGDROP| LVS_EX_FULLROWSELECT| LVS_EX_TRACKSELECT); / 设置列表框的样式CString header4 = 姓名, 性别, 出生日期, 已修学分 ; / 增加列表头部for (int i = 0; i adoEOF)/ 遍历查询结果集合,将每条结果在列表框中显示/ pRecordset

22、-GetCollect(name)取出当前记录的Name字段的值。因为Name字段的值是字符串类型,所以取bstrVal属性获得字段值。CString temp = pRecordset-GetCollect(name).bstrVal; / 往列表框新增一条记录m_ListCtrl.InsertItem(row, temp);/ pRecordset-GetCollect(gender)取出当前记录的gender字段的值。因为gender字段的值整数类型,所以取lVal属性获得字段值。gender = pRecordset-GetCollect(gender).lVal;if (gender

23、 = 0)m_ListCtrl.SetItemText(row, 1, 男);elsem_ListCtrl.SetItemText(row, 1, 女);/ pRecordset-GetCollect(birthday)取出当前记录的birthday字段的值。因为birthday字段的值为时间类型,所以取date属性获得字段值。time = pRecordset-GetCollect(birthday).date;temp = time.Format(%Y-%m-%d);m_ListCtrl.SetItemText(row, 2, temp);/ pRecordset-GetCollect(c

24、redit)取出当前记录的credit字段的值。因为credit字段的值为整数类型,所以取lval属性获得字段值。credit = pRecordset-GetCollect(credit).lVal;temp.Format(%d, credit);m_ListCtrl.SetItemText(row, 3, temp);row+;pRecordset-MoveNext();添加新增记录功能新增编辑框,控件摆放如下图所示。为该编辑框新建一个关联的类CEditInfoDlg控件ID关联变量类型关联变量说明编辑框IDC_EDIT_NAMECStringm_name编辑姓名选择按钮IDC_RADIO

25、_MALEIDC_RADIO_FEMALEIntm_gender选择性别日期控件IDC_DATETIMEPICKER_BIRTHDAYCTimem_birthday选择出生年月日编辑框IDC_EDIT_CREDITIntm_credit编辑学分在CCtrlListDatabaseDlg中增加“新增按钮”响应函数void CCtrlListDatabaseDlg:OnButtonAdd() / TODO: Add your control notification handler code hereCEditInfoDlg dlg;if (IDOK = dlg.DoModal()/ 根据用户在编

26、辑框输入的信息生成sql语句CString sql = insert into student (name, gender, birthday, credit) values (;sql += + dlg.m_name + ;CString gender;gender.Format(%d, dlg.m_gender);sql += , + gender;CString time = dlg.m_birthday.Format(%Y-%m-%d);sql += , + time + ;CString strCredit;strCredit.Format(%d, dlg.m_credit);sql

27、 += , + strCredit + );m_database.Execute(sql);使用Datagrid ActiveX控件本节演示如何使用Datagrid控件显示数据。新建项目基于对话框MFC项目,命名为Datagrid。界面控件设置同上,区别是采用Datagrid控件代替List Control控件。添加Datagrid控件Datagrid控件的添加:菜单栏-项目(Project) -添加至项目(Add to Project)-组件和控件(Components and Controls)选择Registered ActiveX Controls,Microsoft DataGrid

28、 Control点击插入(Insert),确定。此时弹出一个确认框不作修改,点击确定。然后点击关闭(Close)关闭文件对话框。此时控件列表中会多了一个红色的控件Datagrid控件。将Datagrid控件拉到对话框界面。控件ID设为ID_DATAGRID_RESULT,Caption设为“查询结果”,关联变量类型为CDatagrid,变量名为m_datagrid。其余控件设置同上。如图所示。创建数据库新建数据库test.mdb,创建student表。创建数据库操作类CADODatabase具体操作同上。在窗口创建时,建立数据库连接。即在CDatagridDlg:OnInitDialog()函

29、数中添加代码:CString strConnection = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;strConnection += test.mdb;m_database.OpenDatabase(strConnection);使用Datagrid4.1 绑定数据源给查询按钮添加相应函数OnBUTTONQuery。void CDatagridDlg:OnBUTTONQuery() / TODO: Add your control notification handler code hereUpdateData();/ 根据查询条件生成sq

30、l语句CString sql = select * from student where name like %;sql += m_QueryName;sql += %;/ 获得查询结果_RecordsetPtr pRecordset = m_database.Select(sql);m_QueryResult.SetRefDataSource(NULL);/ 绑定数据源m_QueryResult.SetRefDataSource(LPUNKNOWN)pRecordset);m_QueryResult.SetColumnHeaders(TRUE);_variant_t vIndex;CColumn col = NULL;/ 设置显示数据列vIndex = long(0);col = m_QueryResult.GetColumns().GetItem(vIndex);col.SetWidth(50); / 设置列宽度col.SetCaption(id);col.SetVisible(FALSE); / 隐藏主键列不显示vIndex = long(1);col = m_QueryRe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论