1、实验三 VC+Access物流信息系统初步开发实验三 VC+Access物流信息系统初步开发实验目的: 初步掌握综合运用Visual C+ 6.0和Access2003进行数据库编程和物流信息系统初步开发的基本技术和思想。实验内容:1、在Visual C+ 6.0中通过ODBC(开发数据库互联)方式访问并显示Access2003数据库内容;2、在Visual C+ 6.0中通过ADO(ActiveX Data Objects)方式访问并控制Access2003数据库内容;3、实现订单管理系统实训项目的部分代码,如产品管理(包括产品查询、添加、删除和修改等)、系统登录等。实验课时安排:共6课时,
2、其中:2课时用于通过ODBC方式访问并显示数据库;2课时用于通过ADO方式访问并控制数据库;2课时用于订单管理系统部分代码的操作。3.1 在Visual C+ 6.0中使用ODBC方式访问并显示数据库3.1.1 设置后台数据源本节采用ODBC(开发数据库互联)接口同Access 2003数据源相连,并将数据库中的记录数据通过网格的形式显示给用户。在开始编制程序之前首先要通过控制面板-管理工具的ODBC数据源设置我们待操作的后台Access数据源,建立名称为OrderMIS的用户DSN,并将其指向db1.mdb。 图3-1 启动ODBC数据源管理器 图3-2 设置名为OrderMIS的ODBC数
3、据源3.1.2 添加网格控件DBGrid用于显示数据库内容由于默认情况下VC+6.0控件工具箱中没有DBGrid网格控件,故需要手动添加ActiveX Control,方法如下:(1)选择菜单-Project-Add to Project-Components and Controls Gallery;(2)在部件选择对话框中进入Registered ActiveX Controls;(3)选择DBGrid Control,单击Insert按钮,确认后对类进行配置(可以按默认),我们不做任何修改单击OK按钮,插入完成。添加完成后,在控件工具箱中出现了DBGrid控件(最后一个控件)。 图3-3
4、 在VC中添加DBGrid Control3.1.3 添加远程数据访问控件Microsoft RemoteData Control 我们还要继续添加一些辅助的控件来完成同数据库源的绑定。用同插入DBGird控件一样的步骤,插入Microsoft RemoteData Control控件,完成后该控件出现在控件工具箱中(最后一个控件)。图3-4 添加远程数据访问RDC控件3.1.4 通过DBGrid控件和RDC控件显示数据库内容1、添加“产品查询”菜单项的处理函数:在VC+的ResourceView面板中,双击Menu资源中的IDR_MENU1,在右边设计窗口中通过类向导添加“产品查询”的处理函
5、数(如图3-5)。图3-5 添加产品查询菜单项的处理函数2、添加用于“产品查询”菜单项的对话框处理界面:在VC+的菜单栏中选择“Insert”-“Resource”,在弹出的插入资源对话框中选择Dialog,并单击New按钮后,在资源面板中可以看到新插入的对话框IDD_DIALOG1,用于产品查询的处理界面(如图3-6)。图3-6 添加用于产品查询的对话框IDD_DIALOG13、编辑对话框IDD_DIALOG1:通过控件工具箱添加DBGrid控件、Remote Data控件、Combo Box控件、查询按钮等(如图3-7)。图3-7对话框IDD_DIALOG1内容设计4、编辑对话框IDD_D
6、IALOG1中各控件的属性:如图3-8所示。 图3-8 设置各控件的属性5、添加对话框中“查询”按钮的处理函数:左键双击查询按钮,在弹出的对话框中选择“Creating a new class”,点击OK,如图3-9所示: 图3-9 添加对话框中查询按钮的处理函数6、添加代码:(1)在类视图面板中,展开COrder_MISDlg类,首先在文件头添加包含CDialog1类头文件的一行代码,然后添加“产品查询”菜单项OnProduct1的处理函数。#include Dialog1.h void COrder_MISDlg:OnProduct1() / TODO: Add your command
7、handler code here CDialog1 dialog1;dialog1.DoModal(); /启动产品查询对话框(2)在类视图面板中,展开CDialog1类,添加“查询”按钮OnButton1的处理函数。这里,还需要通过启动ClassWizard,添加Combo Box控件的成员变量和RemoteData控件的成员变量,进行控件与变量之间的数据绑定。图3-10 添加对话框中相关控件的成员变量在CDialog1类视图中添加“查询”按钮OnButton1的处理函数:void CDialog1:OnButton1() UpdateData(1); /读取控件值CString sql=
8、select * from 产品;if(m_combo1!=) /当选择了复选按钮的下拉项时sql=sql+ where 产品单价 ;sql=sql+m_combo1; /SQL语句定义 sql=sql+ order by 产品单价; /按产品单价排序m_rdc1.SetSql(sql); /设置产品查询的SQL语句 m_rdc1.Refresh(); /刷新远程数据访问控件7、编译运行:图3-11 点击“产品查询”菜单项后的对话框运行界面及查询结果3.2 在Visual C+ 6.0中使用ADO方式控制和更新数据库ADO(ActiveX Data Objects)是微软开发的基于对象的数据库
9、访问中间件,它将数据库操作抽象成为一个个对象,通过对这些对象的操作来完成数据库应用程序设计。ADO对象模型包括以下关键对象:(1)Connection对象(连接对象)该对象成为连接对象,就是负责数据库连接和断开的对象,该对象在使用Open()函数打开数据库连接开始,直到调用Close()关闭数据库连接为止,它负责维护应用程序和数据库管理系统的一个会话,保证在此之间的数据库操作持续性。(2)Command对象(命令对象)使用SQL语句来操作数据库是数据库管理系统常用的手段,而在应用程序中往往需要借助该手段来简化应用程序设计,因此也需要传递SQL语句来进行数据库操作。命令对象就是负责对一个数据源进
10、行SQL命令传递和执行等操作进行管理,如传递SQL语句字符串、执行的次数和参数等。(3)Parameter对象(参数对象)参数对象是命令对象的辅助对象,主要用于命令对象的参数传递,这些参数本身就是一个对象,叫做参数对象。参数对象将一些操作定义好,然后直接以参数的形式被命令对象调用,以更简单高效的方式对数据库进行操作。(4)Recordset对象(记录集对象)记录集对象顾名思义就是表示记录的集合的对象,它将数据库中的记录的全部或部分读取到内存中,然后将内存中的对象经命令对象处理后,写回到硬盘的数据库中。该对象在数据库记录非常多的时候起到了提高数据库操作效率的作用,使得应用程序不必每个操作都读取硬
11、盘数据库,而是将全部操作在内存中完成后再写回硬盘。本节将基于ADO方式进行数据库操作,包括记录添加、记录删除、记录更新等。以下,以订单管理系统为例,通过ADO数据库操作,实现产品添加、产品删除、产品更新等功能。3.2.1 添加订单管理系统二级菜单项的对话框和消息处理函数(1)启动MFC Class Wizard在COrder_MISDlg类中为产品管理的二级菜单项“产品添加”、“产品删除”和“产品修改”添加消息处理函数(如图3-12所示)。图3-12 添加产品管理二级菜单项的消息处理函数(2)在VC+6.0的主菜单中选择“Insert”-“Resource”-“Dialog”-“New”分别插
12、入3个对话框IDD_DIALOG2、IDD_DIALOG3、IDD_DIALOG4,然后分别对这个三个对话框的界面进行设计(如图3-13所示)。(3)启动MFC Class Wizard分别为三个对话框中的编辑框(Edit Box)控件在各自对话框类中添加相应成员变量,将编辑框与变量绑定(如图3-14所示)。 图3-13 产品添加、删除和修改对话框界面设计 图3-14为产品添加、删除和修改对话框添加新类和成员变量(4)打开ClassView面板,展开COrder_MISDlg类视图(如图3-15),为“产品添加”、“产品删除”和“产品修改”的消息处理函数OnProduct2()、OnProdu
13、ct3()、OnProduct4()添加启动对话框的代码(蓝色部分)。图3-15为产品添加、删除和修改对话框添加消息处理函数的代码void COrder_MISDlg:OnProduct2() / TODO: Add your command handler code here CDialog2 dialog2; dialog2.DoModal(); void COrder_MISDlg:OnProduct3() / TODO: Add your command handler code here CDialog3 dialog3; dialog3.DoModal(); void COrder
14、_MISDlg:OnProduct4() / TODO: Add your command handler code here CDialog4 dialog4; dialog4.DoModal(); 文件前面添加如下包含对话框类头文件的代码:/ Order_MISDlg.cpp : implementation file#include stdafx.h#include Order_MIS.h#include Order_MISDlg.h#include Dialog1.h#include Dialog2.h#include Dialog3.h#include Dialog4.h完成以上代码
15、后,点击产品管理二级菜单项就可以启动相应的对话框处理界面。3.2.2 订单管理系统产品添加功能实现(1)打开“产品添加”对话框,双击“添加”按钮添加处理函数OnButton1()。图3-16为添加按钮加入消息处理函数(2)展开ClassView类视图,在Dialog2类的文件Dialog2.cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):#include stdafx.h#include Order_MIS.h#include Dialog2.h#import c:Program FilesCommon FilesSystemADOmsado15.dll rename_namespa
16、ce(ADOCG) rename(EOF,EndOfFile)该行代码是ADO数据库连接必不可少的语句,它包含了msado15.dll文件,该文件实际上封装了连接数据库及其操作的底层,并将其接口函数提供给开发者使用。(3)展开ClassView类视图中,在Dialog2类的CDialog2:OnButton1()函数中添加如下代码(蓝色部分):void CDialog2:OnButton1() / TODO: Add your control notification handler code here UpdateData(1); /读取控件值 ADOCG:_ConnectionPtr m_
17、pConnection; CoInitialize(NULL); m_pConnection.CreateInstance(_uuidof(ADOCG:Connection);/创建数据库连接对象 ADOCG:_RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance(_uuidof(ADOCG:Recordset);/创建数据库记录对象 CString pathName(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=); pathName += db1.mdb; try /数据库连接到当前目录下指
18、定的数据库文件 m_pConnection-Open(pathName.AllocSysString(),ADOCG:adModeUnknown); catch(_com_error e) MessageBox(该路径下没有这个数据库); _variant_t vRecords; CString temp,temp2,sql= select max(产品ID)+1 as max_id from 产品; m_pRecordset-Open(sql.AllocSysString(),_variant_t(IDispatch*)m_pConnection,true),ADOCG:adOpenStat
19、ic,ADOCG:adLockOptimistic,ADOCG:adCmdText);/打开数据集 vRecords = m_pRecordset-GetCollect(max_id); temp= (LPCSTR)(_bstr_t)vRecords; /SQL查询得到下一条记录的产品ID temp2=; sql= insert into 产品 values(; sql+=temp+,; sql+=temp2+m_edit1+temp2+,; sql+=m_edit2+); /SQL插入新记录 m_pConnection-Execute(sql.AllocSysString(),&vRecor
20、ds,ADOCG:adCmdText); /执行SQL语句 m_pRecordset-Update(); if(m_pConnection-State) m_pConnection-Close(); /关闭数据库连接 m_pConnection= NULL; MessageBox(成功添加新产品信息!,提示); CDialog:OnOK();注意:db1.mdb数据库文件需要放在当前程序文件目录下。完成以上代码后,按Ctrl+F5执行后,点击“产品添加”二级菜单项,即可在对话框处理界面中通过输入新产品名称和单价,添加新产品。3.2.3 订单管理系统产品删除功能实现(1)打开“产品删除”对话框,
21、双击“删除”按钮添加处理函数OnButton1()。图3-17为删除按钮加入消息处理函数(2)展开ClassView类视图,在Dialog3类的文件Dialog3.cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):#include stdafx.h#include Order_MIS.h#include Dialog3.h#import c:Program FilesCommon FilesSystemADOmsado15.dll rename_namespace(ADOCG) rename(EOF,EndOfFile)(3)展开ClassView类视图中,在Dialog3类的CDia
22、log3:OnButton1()函数中添加如下代码(蓝色部分):void CDialog3:OnButton1() / TODO: Add your control notification handler code here UpdateData(1); ADOCG:_ConnectionPtr m_pConnection; CoInitialize(NULL); m_pConnection.CreateInstance(_uuidof(ADOCG:Connection);/创建数据库连接对象 ADOCG:_RecordsetPtr m_pRecordset; m_pRecordset.Cr
23、eateInstance(_uuidof(ADOCG:Recordset);/创建数据库记录对象 CString pathName(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=); pathName += db1.mdb; try /数据库连接到当前目录下指定的数据库文件 m_pConnection-Open(pathName.AllocSysString(),ADOCG:adModeUnknown); catch(_com_error e) MessageBox(该路径下没有这个数据库); _variant_t vRecords; m_pReco
24、rdset-Open(select * from 产品,_variant_t(IDispatch*)m_pConnection,true),ADOCG:adOpenStatic,ADOCG:adLockOptimistic,ADOCG:adCmdText);/打开数据集 CString temp=; CString sql= delete from 产品 where 产品名称=; sql+=temp+m_edit1+temp; /定义SQL命令字串 MessageBox(确定删除该产品信息?,确认); m_pConnection-Execute(sql.AllocSysString(),&vR
25、ecords,ADOCG:adCmdText); /执行SQL删除语句 m_pRecordset-Update(); if(m_pConnection-State) m_pConnection-Close(); /关闭数据库连接 m_pConnection= NULL; CDialog:OnOK();完成以上代码后,按Ctrl+F5执行后,点击“产品删除”二级菜单项,即可在对话框处理界面中删除所输入的产品。3.2.4 订单管理系统产品修改功能实现(1)打开“产品修改”对话框,双击“查看”按钮添加处理函数OnButton1(),双击“修改”按钮添加处理函数OnButton2()。(2)展开Cla
26、ssView类视图,在Dialog4类的文件Dialog4cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):#include stdafx.h#include Order_MIS.h#include Dialog4.h#import c:Program FilesCommon FilesSystemADOmsado15.dll rename_namespace(ADOCG) rename(EOF,EndOfFile)(3)展开ClassView类视图,在Dialog4类的CDialog4:OnButton1()函数中添加如下代码(蓝色部分):void CDialog4:OnButton
27、1() / TODO: Add your control notification handler code here UpdateData(1); ADOCG:_ConnectionPtr m_pConnection; CoInitialize(NULL); m_pConnection.CreateInstance(_uuidof(ADOCG:Connection);/创建数据库连接对象 ADOCG:_RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance(_uuidof(ADOCG:Recordset);/创建数据库记录对象 CStri
28、ng pathName(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=); pathName += db1.mdb; try /数据库连接到当前目录下指定的数据库文件 m_pConnection-Open(pathName.AllocSysString(),ADOCG:adModeUnknown); catch(_com_error e) MessageBox(该路径下没有这个数据库); _variant_t vRecords; CString temp=; CString sql= select * from 产品 where 产品名称=; sql
29、+=temp+m_edit1+temp; /定义SQL命令字串 m_pRecordset-Open(sql.AllocSysString(),_variant_t(IDispatch*)m_pConnection,true),ADOCG:adOpenStatic,ADOCG:adLockOptimistic,ADOCG:adCmdText);/打开数据集 vRecords = m_pRecordset-GetCollect(产品ID); m_edit2= (LPCSTR)(_bstr_t)vRecords; vRecords = m_pRecordset-GetCollect(产品名称); m_edit3= (LPCSTR)(_bstr_t)vRecords; vRecords = m_pRecordset-GetCollect(产品单价); m_edit4= (LPCSTR)(_bstr_t)vRecords; if(m_pConnection-State) m_pConnection-Close(); /关闭数据库连接 m_pConnection= NULL; UpdateData(0);(4)展开ClassView类视图中,在Dialog4类的CDialog4:OnButton2()函数中添加如下代码(蓝色部分):void CDialog4:OnButton2() /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1