已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC 下使用 ADO 读写 Access 数据库实例一、 原型系统描述 2二、 数据库表设计 2三、 数据库编程 21. 新建 MFC 基于对话框项目 22. 用#import 指令引入 ADO 类型库 23. 创建数据库操作类 CADODatabase.33.1 为 CADODatabase 添加两个成员变量 33.2 添加 OpenDatabase 函数 33.3 添加 CloseDatabase 函数 43.4 添加 Select 函数 53.5 添加 Execute 函数 6四、 MFC 界面编程 .61. 在对话框中添加控件 62. 在程序启动时初始化列表框,并连接数据库 72.1 初始化列表框 72.2 连接数据库 73. 添加查询功能 84. 添加新增记录功能 9五、 使用 Datagrid ActiveX 控件 .101. 添加 Datagrid 控件 102. 创建数据库 113. 创建数据库操作类 CADODatabase.124. 使用 Datagrid .124.1 绑定数据源 .124.2 添加记录 .13说明:本文以“学生信息管理”系统雏形为例子,介绍在 MFC 下如何使用 ADO 连接数据库编程,并给出示例代码。下面内容第一至四节介绍如何采用 ADO 连接数据库、关闭数据、执行 sql 语句及如何用另一种方式执行常用的 select 语句。第五节介绍如何使用Datagrid 控件:建立_RecordsetPtr 对象与 Datagrid 控件之间的绑定,通过改变_RecordsetPtr对象的内容更新数据库表的记录。第一至四节的内容请参考代码“CtrlListDatabase.rar” ,第五节内容请参考“Datagrid.rar”请同学们结合 ADO.NET 课程内容自主学习,将所学到的技术应用到项目实训中。一、原型系统描述本程序为一个学生信息管理系统雏形。程序界面如下图左图所示。用户在姓名栏输入查询字段,列表框中列出查询结果。如下图右图所示。用户点击新增记录按钮新增学生信息记录。二、数据库表设计建立 Access 文件 test.mdb,创建 student 表,表中字段名称、数据类型及各字段的说明设置如下三、数据库编程1. 新建 MFC 基于对话框项目新建 MFC 基于对话框项目。本例中对项目命名为 CtrlListDatabase。2. 用#import 指令引入 ADO 类型库为了引入 ADO 类型库,需要在项目的 stdafx.h 文件中加入如下语句:#import “C:Program FilesCommon FilesSystemadomsado15.dll“ no_namespace rename(“EOF“, “adoEOF“)注意添加的位置在#endif /_AFX_NO_AFXCMN_SUPPORT 之后3. 创建数据库操作类 CADODatabase3.1 为 CADODatabase 添加两个成员变量_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;其中 m_pConnection 是一个指向 Connection 对象的指针,通过它来连接数据库。m_pRecordset 是一个指向记录集合的指针,从数据库查询得到的结果放在 m_pRecordset 中。3.2 添加 OpenDatabase 函数功能:连接数据库输入:数据库连接串 strConnection(其含义见第四部分第二步中 2.2 的解释)输出:TRUE,如果成功连接数据库,FALSE,如果连接数据库失败BOOL CADODatabase:OpenDatabase(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)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是登陆密码;在本例子中,数据库的用户名和密码均没创建,所以去空值”。参数 Options是连接选项,用于指定 Connection 对象对数据的更新许可权,一般情况下 Options 可以是如下几个常量:adModeUnknown 缺省。当前的许可权未设置adModeRead 只读adModeWrite 只写adModeReadWrite 可以读写adModeShareDenyRead 阻止其它 Connection 对象以读权限打开连接adModeShareDenyWrite 阻止其它 Connection 对象以写权限打开连接adModeShareExclusive 阻止其它 Connection 对象以读写权限打开连接adModeShareDenyNone 阻止其它 Connection 对象以任何权限打开连接3.3 添加 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;3.4 添加 Select 函数功能:返回查询结果输入:查询语句字符串 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,adLockBatchOptimistic,adCmdText);return m_pRecordset;其中 Open 方法原型如下:HRESULT Recordset15:Open ( const _variant_t 参数 LockType 表示数据库的锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只读记录集adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3,乐观锁定方式。只有在你调用 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 = DISP_E_PARAMNOTFOUND; /定义为无参数m_pCommand-ActiveConnection = m_pConnection; /非常关键的一句,将建立的连接赋值给它m_pCommand-CommandText = “SELECT * FROM users“; /命令字串m_pRecordset = m_pCommand-Execute( return m_pRecordset;3.5 添加 Execute 函数功能:执行 sql 语句(例如 Insert、Update 操作等)输入:sql 语句字符串返回值:TRUE,如果成功执行。BOOL CADODatabase:Execute(CString sql)_bstr_t CommandText(sql);_variant_t RecordsAffected;m_pConnection-Execute(CommandText, return TRUE;四、MFC 界面编程1. 在对话框中添加控件控件 ID 关联变量 类型 关联变量 说明编辑框 IDC_EDIT_NAME CString m_strQueryName 查询姓名 编辑框列表控件 IDC_LIST_STUDENT_INFO CListCtrl m_listCtrl 查询记录 列表狂将列表框控件的 View 属性(在 Style 选项卡下)设置为 Report2. 在程序启动时初始化列表框,并连接数据库在 CCtrlListDatabaseDlg:OnInitDialog()函数中添加两部分代码:2.1 初始化列表框m_ListCtrl.SetExtendedStyle(LVS_EX_HEADERDRAGDROP| LVS_EX_FULLROWSELECT| LVS_EX_TRACKSELECT); / 设置列表框的样式CString header4 = “姓名“, “性别“, “出生日期“, “已修学分“ ; / 增加列表头部for (int i = 0; i adoEOF) / 遍历查询结果集合,将每条结果在列表框中显示/ pRecordset-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 = 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(“credit“)取出当前记录的 credit 字段的值。因为 credit 字段的值为整数类型,所以取 lval 属性获得字段值。credit = pRecordset-GetCollect(“credit“).lVal;temp.Format(“%d“, credit);m_ListCtrl.SetItemText(row, 3, temp);row+;pRecordset-MoveNext();4. 添加新增记录功能新增编辑框,控件摆放如下图所示。为该编辑框新建一个关联的类 CEditInfoDlg控件 ID 关联变量 类型 关联变量 说明编辑框 IDC_EDIT_NAME CString m_name 编辑姓名选择按钮 IDC_RADIO_MALEIDC_RADIO_FEMALE Int m_gender 选择性别日期控件 IDC_DATETIMEPICKER_BIRTHDAY CTime m_birthday 选择出生 年月日编辑框 IDC_EDIT_CREDIT Int m_credit 编辑学分在 CCtrlListDatabaseDlg 中增加“新增按钮”响应函数void CCtrlListDatabaseDlg:OnButtonAdd() / TODO: Add your control notification handler code hereCEditInfoDlg dlg;if (IDOK = dlg.DoModal()/ 根据用户在编辑框输入的信息生成 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 += “, “ + strCredit + “)“;m_database.Execute(sql);五、使用 Datagrid ActiveX 控件本节演示如何使用 Datagrid 控件显示数据。新建项目基于对话框 MFC 项目,命名为Datagrid。界面控件设置同上,区别是采用 Datagrid 控件代替 List Control 控件。1. 添加 Datagrid 控件Datagrid 控件的添加:菜单栏-项目(Project) -添加至项目(Add to Project)-组件和控件(Components and Controls)选择 Registered ActiveX Controls,Microsoft DataGrid Control点击插入(Insert),确定。此时弹出一个确认框不作修改,点击确定。然后点击关闭(Close)关闭文件对话框。此时控件列表中会多了一个红色的控件-Datagrid 控件。将 Datagrid 控件拉到对话框界面。控件 ID 设为 ID_DATAGRID_RESULT,Caption 设为“查询结果” ,关联变量类型为 CDatagrid,变量名为 m_datagrid。其余控件设置同上。如图所示。2. 创建数据库新建数据库 test.mdb,创建 student 表。3. 创建数据库操作类 CADODatabase具体操作同上。在窗口创建时,建立数据库连接。即在 CDatagridDlg:OnInitDialog()函数中添加代码:CString strConnection = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“;strConnection += “test.mdb“;m_database.OpenDatabase(strConnection);4. 使用 Datagrid4.1 绑定数据源给查询按钮添加相应函数 OnBUTTONQuery。void CDatagridDlg:OnBUTTONQuery() / TODO: Add your control notification handler code hereUpdateData();/ 根据查询条件生成 sql 语句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_QueryResult.GetColumns().GetItem(vIndex);col.SetWidth(50); / 宽度col.SetCaption(“姓名“);vIndex = long(2);col = m_QueryResult.GetColumns().GetItem(vIndex);col.SetWidth(50); / 宽度col.SetCapti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 针灸疗法考试题目及答案解析
- 2026年湖南省人教版九年级历史下册第七单元历史事件分析题库试卷
- MBA复试面试题目及参考答案
- 揭秘新疆警察面试题目及答案
- 中职语文课练习题及完整答案
- 2025-2026学年山东省潍坊安丘市、高密市三年级数学第二学期期末考试试题(含答案)
- 护理试题及答案解读:六个解答题的思路与答案
- 招聘管理模拟试卷及答案解析
- 家庭宠物急救知识考核试卷
- 2026年老客召回EDM营销效果评估考核试卷
- 2026邢台银行招聘笔试备考题库及答案详解
- 高处施工作业风险防控专项方案
- 2025年成都七初锦城初一入学语文分班考试真题含答案
- 2026-2030中国DJ设备行业市场发展趋势与前景展望战略分析研究报告
- 2026年电子商务投资合作合同模板(风险共担)
- 2026中国机场助航灯光系统节能改造市场潜力与投资价值评估
- 2026年高考语文真题全国一卷文言文逐句注解+翻译(含课内拓展+文言现象)
- 2026年消防继续教育题目考前冲刺练习题【必考】附答案详解
- 深入学习生态环境法典
- 国家基层全科常见疾病诊疗指南(2023版)
- 2026年乌鲁木齐一中分班测试题及答案
评论
0/150
提交评论