版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC下使用ADO读写Access数据库实例一、原型系统描述2二、数据库表设计2三、数据库编程21.新建MFC基于对话框项目22.用#import指令引入ADO类型库23.创建数据库操作类CADODatabase33.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 Ac
2、tiveX控件101.添加Datagrid控件102.创建数据库113.创建数据库操作类CADODatabase124.使用Datagrid124.1 绑定数据源124.2 添加记录13说明:本文以“学生信息管理”系统雏形为例子,介绍在MFC下如何使用ADO连接数据库编程,并给出示例代码。下面内容第一至四节介绍如何采用ADO连接数据库、关闭数据、执行sql语句及如何用另一种方式执行常用的select语句。第五节介绍如何使用Datagrid控件:建立_RecordsetPtr对象与Datagrid控件之间的绑定,通过改变_RecordsetPtr对象的内容更新数据库表的记录。第一至四节的内容请参
3、考代码“CtrlListDatabase.rar”,第五节内容请参考“Datagrid.rar”请同学们结合ADO.NET课程内容自主学习,将所学到的技术应用到项目实训中。一、 原型系统描述本程序为一个学生信息管理系统雏形。程序界面如下图左图所示。用户在姓名栏输入查询字段,列表框中列出查询结果。如下图右图所示。用户点击新增记录按钮新增学生信息记录。二、 数据库表设计建立Access文件test.mdb,创建student表,表中字段名称、数据类型及各字段的说明设置如下三、 数据库编程1. 新建MFC基于对话框项目新建MFC基于对话框项目。本例中对项目命名为CtrlListDatabase。2.
4、 用#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;_Reco
5、rdsetPtr m_pRecordset;其中m_pConnection是一个指向Connection对象的指针,通过它来连接数据库。m_pRecordset是一个指向记录集合的指针,从数据库查询得到的结果放在m_pRecordset中。3.2 添加OpenDatabase函数功能:连接数据库输入:数据库连接串strConnection(其含义见第四部分第二步中2.2的解释)输出:TRUE,如果成功连接数据库,FALSE,如果连接数据库失败BOOL CADODatabase:OpenDatabase(CString strConection)HRESULT hr = :CoInitializ
6、e(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;c
7、atch (_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是登陆密码;在本例子中,数
8、据库的用户名和密码均没创建,所以去空值”。参数Options是连接选项,用于指定Connection对象对数据的更新许可权,一般情况下Options可以是如下几个常量:adModeUnknown缺省。当前的许可权未设置adModeRead只读adModeWrite只写adModeReadWrite可以读写adModeShareDenyRead阻止其它Connection对象以读权限打开连接adModeShareDenyWrite阻止其它Connection对象以写权限打开连接adModeShareExclusive阻止其它Connection对象以读写权限打开连接adModeShareDeny
9、None阻止其它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();r
10、eturn 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_pConnec
11、tion.GetInterfacePtr(),adOpenDynamic,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是数据查询字符串;参数
12、ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象);参数CursorType光标类型,它可以是以下值之一;请看这个枚举结构:enum CursorTypeEnumadOpenUnspecified = -1,/不作特别指定adOpenForwardOnly = 0,/前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,/采用
13、这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。adOpenDynamic = 2,/动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。adOpenStatic = 3/静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。;参数LockType表示数据库的锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只读记录集adLockPessimistic = 2,悲观锁定方式。数
14、据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。;方法二:利用Command对象来执行SQL命令_RecordsetPtr CADODatabase:Select(CString sql)_CommandPtr m_pCommand;m_pCommand.CreateInstance("ADODB.Command&quo
15、t;);_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(&vNULL,&vNULL,adCmdText);return m_pR
16、ecordset;3.5 添加Execute函数功能:执行sql语句(例如Insert、Update操作等)输入:sql语句字符串返回值:TRUE,如果成功执行。BOOL CADODatabase:Execute(CString sql)_bstr_t CommandText(sql);_variant_t RecordsAffected;m_pConnection->Execute(CommandText, &RecordsAffected, adCmdText);return TRUE;四、 MFC界面编程1. 在对话框中添加控件控件ID关联变量类型关联变量说明编辑框IDC_
17、EDIT_NAMECStringm_strQueryName查询姓名编辑框列表控件IDC_LIST_STUDENT_INFOCListCtrlm_listCtrl查询记录列表狂将列表框控件的View属性(在Style选项卡下)设置为Report2. 在程序启动时初始化列表框,并连接数据库在CCtrlListDatabaseDlg:OnInitDialog()函数中添加两部分代码:2.1 初始化列表框m_ListCtrl.SetExtendedStyle(LVS_EX_HEADERDRAGDROP| LVS_EX_FULLROWSELECT| LVS_EX_TRACKSELECT);/ 设置列表
18、框的样式CString header4 = "姓名", "性别", "出生日期", "已修学分" ; / 增加列表头部for (int i = 0; i < 4; i+)m_ListCtrl.InsertColumn(i, headeri, LVCFMT_CENTER, 80);2.2 连接数据库为CCtrlListDatabaseDlg类添加成员变量m_database,其类型为CADODatabase.数据库连接代码如下:CString strConnection = "Provider=Mic
19、rosoft.Jet.OLEDB.4.0;Data Source="strConnection += "test.mdb"m_database.OpenDatabase(strConnection);strConnection是数据库连接字符串。本项目采用Jet引擎连接Access数据库,所以Provider=Microsoft.Jet.OLEDB.4.0; Data Source后面写的是数据库名称。我们在第一步中建立的数据库文件叫test.mdb,所以本项目中连接数据库的字符串是Provider=Microsoft.Jet.OLEDB.4.0;Data Sou
20、rce= test.mdb(注意:test.mdb应该放在项目所在文件下,否则需要把test.mdb所在路径也上。例如,如果test.mdb放在d盘根目录下,则该写d:test.mdb)如果项目中采用SQLServer作为数据库,则需要修改数据库连接字符串。例如:driver=SQL Server;Server=;DATABASE=vckbase;UID=sa;PWD=139其中driver=SQL Server; 表示项目采用SQLServer作为数据库。 Server 表示数据库所在机器,如果用本机数据库,则写。 DATABASE指数据库名称。 UID是
21、连接数据库时的用户名,PWD指密码。如果用户名/密码为空,则使用”。3. 添加查询功能为查询按钮添加响应函数void CCtrlListDatabaseDlg:OnButtonQuery() / TODO: Add your control notification handler code herem_ListCtrl.DeleteAllItems();/ 删除列表控件中已有记录UpdateData();CString sql = "select * from student where name like '%"/ 根据用户输入的查询名称生成sql语句。sql
22、+= m_strQueryName;sql += "%'"_RecordsetPtr pRecordset = m_database.Select(sql);/ 获得查询结果集合CString record4;CString temp;COleDateTime time;int gender, credit;int row = 0;while (!pRecordset->adoEOF)/ 遍历查询结果集合,将每条结果在列表框中显示/ pRecordset->GetCollect("name")取出当前记录的Name字段的值。因为Nam
23、e字段的值是字符串类型,所以取bstrVal属性获得字段值。CString temp = pRecordset->GetCollect("name").bstrVal;/ 往列表框新增一条记录m_ListCtrl.InsertItem(row, temp);/ pRecordset->GetCollect("gender")取出当前记录的gender字段的值。因为gender字段的值整数类型,所以取lVal属性获得字段值。gender = pRecordset->GetCollect("gender").lVal;i
24、f (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("%
25、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-&
26、gt;MoveNext();4. 添加新增记录功能新增编辑框,控件摆放如下图所示。为该编辑框新建一个关联的类CEditInfoDlg控件ID关联变量类型关联变量说明编辑框IDC_EDIT_NAMECStringm_name编辑姓名选择按钮IDC_RADIO_MALEIDC_RADIO_FEMALEIntm_gender选择性别日期控件IDC_DATETIMEPICKER_BIRTHDAYCTimem_birthday选择出生年月日编辑框IDC_EDIT_CREDITIntm_credit编辑学分在CCtrlListDatabaseDlg中增加“新增按钮”响应函数void CCtrlListDa
27、tabaseDlg: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
28、;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 + ")&quo
29、t;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 C
30、ontrol点击插入(Insert),确定。此时弹出一个确认框不作修改,点击确定。然后点击关闭(Close)关闭文件对话框。此时控件列表中会多了一个红色的控件-Datagrid控件。将Datagrid控件拉到对话框界面。控件ID设为ID_DATAGRID_RESULT,Caption设为“查询结果”,关联变量类型为CDatagrid,变量名为m_datagrid。其余控件设置同上。如图所示。2. 创建数据库新建数据库test.mdb,创建student表。3. 创建数据库操作类CADODatabase具体操作同上。在窗口创建时,建立数据库连接。即在CDatagridDlg:OnInitDial
31、og()函数中添加代码: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
32、 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
33、);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("姓名&quo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽芜湖市镜湖区芜湖11中、中江中学2026届九年级下学期中考二模数学试卷(含解析)
- 第8章 AI实践:基于AI制作视频网站首页
- 交通违法应急处置预案(3篇)
- 中式门口施工方案模板(3篇)
- 临床肝胆枢机失和阴阳失调顽固性慢性失眠的中医调治疑难讨论
- 温泉休闲服务消费合同三篇
- 2026年宁夏中考数学(真题)带答案
- 2026年青海考研英语(真题)试卷带答案
- 广西壮族自治区河池市重点学校初一入学数学分班考试试题及答案
- 2026年内蒙古小升初(数学)考试试题(含答案)
- 2026年甘肃庆阳宁县直事业单位选聘24人笔试参考题库及答案详解
- 四川能投发展股份有限公司所属公司2026年员工公开招聘笔试备考试题及答案详解
- 广西玉林兴业县2026年警务辅助人员招聘考试试卷-含答案解析
- 2026年江苏职业卫生技术服务专业技术人员考试(放射卫生检测与评价)模拟题及答案
- 2026-2030中国工程爆破行业十四五发展分析及投资前景与战略规划研究报告
- 街区门楼改造方案范本
- 2026年中国邮政四川省分公司笔试题及答案
- 24J113-1 内隔墙-轻质条板(一)
- 考研管理学综合复习资料
- 行业舆情应对案例-洞察分析
- 《食品工程原理》第五章-传热
评论
0/150
提交评论