实验三 VC+Access物流信息系统初步开发.docx
《实验三 VC+Access物流信息系统初步开发.docx》由会员分享,可在线阅读,更多相关《实验三 VC+Access物流信息系统初步开发.docx(36页珍藏版)》请在冰豆网上搜索。
实验三VC+Access物流信息系统初步开发
实验三VC+Access物流信息系统初步开发
实验目的:
初步掌握综合运用VisualC++6.0和Access2003进行数据库编程和物流信息系统初步开发的基本技术和思想。
实验内容:
1、在VisualC++6.0中通过ODBC(开发数据库互联)方式访问并显示Access2003数据库内容;
2、在VisualC++6.0中通过ADO(ActiveXDataObjects)方式访问并控制Access2003数据库内容;
3、实现订单管理系统实训项目的部分代码,如产品管理(包括产品查询、添加、删除和修改等)、系统登录等。
实验课时安排:
共6课时,其中:
2课时用于通过ODBC方式访问并显示数据库;2课时用于通过ADO方式访问并控制数据库;2课时用于订单管理系统部分代码的操作。
3.1在VisualC++6.0中使用ODBC方式访问并显示数据库
3.1.1设置后台数据源
本节采用ODBC(开发数据库互联)接口同Access2003数据源相连,并将数据库中的记录数据通过网格的形式显示给用户。
在开始编制程序之前首先要通过控制面板-管理工具的ODBC数据源设置我们待操作的后台Access数据源,建立名称为"OrderMIS"的用户DSN,并将其指向db1.mdb。
图3-1启动ODBC数据源管理器
图3-2设置名为OrderMIS的ODBC数据源
3.1.2添加网格控件DBGrid用于显示数据库内容
由于默认情况下VC++6.0控件工具箱中没有DBGrid网格控件,故需要手动添加ActiveXControl,方法如下:
(1)选择菜单->Project->AddtoProject->ComponentsandControlsGallery;
(2)在部件选择对话框中进入RegisteredActiveXControls;
(3)选择DBGridControl,单击Insert按钮,确认后对类进行配置(可以按默认),我们不做任何修改单击OK按钮,插入完成。
添加完成后,在控件工具箱中出现了DBGrid控件(最后一个控件)。
图3-3在VC中添加DBGridControl
3.1.3添加远程数据访问控件MicrosoftRemoteDataControl
我们还要继续添加一些辅助的控件来完成同数据库源的绑定。
用同插入DBGird控件一样的步骤,插入MicrosoftRemoteDataControl控件,完成后该控件出现在控件工具箱中(最后一个控件)。
图3-4添加远程数据访问RDC控件
3.1.4通过DBGrid控件和RDC控件显示数据库内容
1、添加“产品查询”菜单项的处理函数:
在VC++的ResourceView面板中,双击Menu资源中的IDR_MENU1,在右边设计窗口中通过类向导添加“产品查询”的处理函数(如图3-5)。
图3-5添加产品查询菜单项的处理函数
2、添加用于“产品查询”菜单项的对话框处理界面:
在VC++的菜单栏中选择“Insert”-“Resource”,在弹出的插入资源对话框中选择Dialog,并单击New按钮后,在资源面板中可以看到新插入的对话框IDD_DIALOG1,用于产品查询的处理界面(如图3-6)。
图3-6添加用于产品查询的对话框IDD_DIALOG1
3、编辑对话框IDD_DIALOG1:
通过控件工具箱添加DBGrid控件、RemoteData控件、ComboBox控件、查询按钮等(如图3-7)。
图3-7对话框IDD_DIALOG1内容设计
4、编辑对话框IDD_DIALOG1中各控件的属性:
如图3-8所示。
图3-8设置各控件的属性
5、添加对话框中“查询”按钮的处理函数:
左键双击查询按钮,在弹出的对话框中选择“Creatinganewclass”,点击OK,如图3-9所示:
图3-9添加对话框中查询按钮的处理函数
6、添加代码:
(1)在类视图面板中,展开COrder_MISDlg类,首先在文件头添加包含CDialog1类头文件的一行代码,然后添加“产品查询”菜单项OnProduct1的处理函数。
#include"Dialog1.h"
voidCOrder_MISDlg:
:
OnProduct1()
{
//TODO:
Addyourcommandhandlercodehere
CDialog1dialog1;
dialog1.DoModal();//启动产品查询对话框
}
(2)在类视图面板中,展开CDialog1类,添加“查询”按钮OnButton1的处理函数。
这里,还需要通过启动ClassWizard,添加ComboBox控件的成员变量和RemoteData控件的成员变量,进行控件与变量之间的数据绑定。
图3-10添加对话框中相关控件的成员变量
在CDialog1类视图中添加“查询”按钮OnButton1的处理函数:
voidCDialog1:
:
OnButton1()
{
UpdateData
(1);//读取控件值
CStringsql="select*from产品";
if(m_combo1!
="")//当选择了复选按钮的下拉项时
{
sql=sql+"where产品单价";
sql=sql+m_combo1;//SQL语句定义
}
sql=sql+"orderby产品单价";//按产品单价排序
m_rdc1.SetSql(sql);//设置产品查询的SQL语句
m_rdc1.Refresh();//刷新远程数据访问控件
}
7、编译运行:
图3-11点击“产品查询”菜单项后的对话框运行界面及查询结果
3.2在VisualC++6.0中使用ADO方式控制和更新数据库
ADO(ActiveXDataObjects)是微软开发的基于对象的数据库访问中间件,它将数据库操作抽象成为一个个对象,通过对这些对象的操作来完成数据库应用程序设计。
ADO对象模型包括以下关键对象:
(1)Connection对象(连接对象)
该对象成为连接对象,就是负责数据库连接和断开的对象,该对象在使用Open()函数打开数据库连接开始,直到调用Close()关闭数据库连接为止,它负责维护应用程序和数据库管理系统的一个会话,保证在此之间的数据库操作持续性。
(2)Command对象(命令对象)
使用SQL语句来操作数据库是数据库管理系统常用的手段,而在应用程序中往往需要借助该手段来简化应用程序设计,因此也需要传递SQL语句来进行数据库操作。
命令对象就是负责对一个数据源进行SQL命令传递和执行等操作进行管理,如传递SQL语句字符串、执行的次数和参数等。
(3)Parameter对象(参数对象)
参数对象是命令对象的辅助对象,主要用于命令对象的参数传递,这些参数本身就是一个对象,叫做参数对象。
参数对象将一些操作定义好,然后直接以参数的形式被命令对象调用,以更简单高效的方式对数据库进行操作。
(4)Recordset对象(记录集对象)
记录集对象顾名思义就是表示记录的集合的对象,它将数据库中的记录的全部或部分读取到内存中,然后将内存中的对象经命令对象处理后,写回到硬盘的数据库中。
该对象在数据库记录非常多的时候起到了提高数据库操作效率的作用,使得应用程序不必每个操作都读取硬盘数据库,而是将全部操作在内存中完成后再写回硬盘。
本节将基于ADO方式进行数据库操作,包括记录添加、记录删除、记录更新等。
以下,以订单管理系统为例,通过ADO数据库操作,实现产品添加、产品删除、产品更新等功能。
3.2.1添加订单管理系统二级菜单项的对话框和消息处理函数
(1)启动MFCClassWizard在COrder_MISDlg类中为产品管理的二级菜单项“产品添加”、“产品删除”和“产品修改”添加消息处理函数(如图3-12所示)。
图3-12添加产品管理二级菜单项的消息处理函数
(2)在VC++6.0的主菜单中选择“Insert”-“Resource”-“Dialog”-“New”分别插入3个对话框IDD_DIALOG2、IDD_DIALOG3、IDD_DIALOG4,然后分别对这个三个对话框的界面进行设计(如图3-13所示)。
(3)启动MFCClassWizard分别为三个对话框中的编辑框(EditBox)控件在各自对话框类中添加相应成员变量,将编辑框与变量绑定(如图3-14所示)。
图3-13产品添加、删除和修改对话框界面设计
图3-14为产品添加、删除和修改对话框添加新类和成员变量
(4)打开ClassView面板,展开COrder_MISDlg类视图(如图3-15),为“产品添加”、“产品删除”和“产品修改”的消息处理函数OnProduct2()、OnProduct3()、OnProduct4()添加启动对话框的代码(蓝色部分)。
图3-15为产品添加、删除和修改对话框添加消息处理函数的代码
voidCOrder_MISDlg:
:
OnProduct2()
{
//TODO:
Addyourcommandhandlercodehere
CDialog2dialog2;
dialog2.DoModal();
}
voidCOrder_MISDlg:
:
OnProduct3()
{
//TODO:
Addyourcommandhandlercodehere
CDialog3dialog3;
dialog3.DoModal();
}
voidCOrder_MISDlg:
:
OnProduct4()
{
//TODO:
Addyourcommandhandlercodehere
CDialog4dialog4;
dialog4.DoModal();
}
文件前面添加如下包含对话框类头文件的代码:
//Order_MISDlg.cpp:
implementationfile
#include"stdafx.h"
#include"Order_MIS.h"
#include"Order_MISDlg.h"
#include"Dialog1.h"
#include"Dialog2.h"
#include"Dialog3.h"
#include"Dialog4.h"
完成以上代码后,点击产品管理二级菜单项就可以启动相应的对话框处理界面。
3.2.2订单管理系统产品添加功能实现
(1)打开“产品添加”对话框,双击“添加”按钮添加处理函数OnButton1()。
图3-16为添加按钮加入消息处理函数
(2)展开ClassView类视图,在Dialog2类的文件Dialog2.cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):
#include"stdafx.h"
#include"Order_MIS.h"
#include"Dialog2.h"
#import"c:
\ProgramFiles\CommonFiles\System\ADO\msado15.dll"rename_namespace("ADOCG")rename("EOF","EndOfFile")
该行代码是ADO数据库连接必不可少的语句,它包含了msado15.dll文件,该文件实际上封装了连接数据库及其操作的底层,并将其接口函数提供给开发者使用。
(3)展开ClassView类视图中,在Dialog2类的CDialog2:
:
OnButton1()函数中添加如下代码(蓝色部分):
voidCDialog2:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData
(1);//读取控件值
ADOCG:
:
_ConnectionPtrm_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(ADOCG:
:
Connection));//创建数据库连接对象
ADOCG:
:
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(ADOCG:
:
Recordset));//创建数据库记录对象
CStringpathName("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=");
pathName+="db1.mdb";
try
{
//数据库连接到当前目录下指定的数据库文件
m_pConnection->Open(pathName.AllocSysString(),"","",ADOCG:
:
adModeUnknown);
}
catch(_com_errore)
{
MessageBox("该路径下没有这个数据库");
}
_variant_tvRecords;
CStringtemp,temp2,sql="selectmax(产品ID)+1asmax_idfrom产品";
m_pRecordset->Open(sql.AllocSysString(),_variant_t((IDispatch*)m_pConnection,true),ADOCG:
:
adOpenStatic,ADOCG:
:
adLockOptimistic,ADOCG:
:
adCmdText);//打开数据集
vRecords=m_pRecordset->GetCollect("max_id");
temp=(LPCSTR)(_bstr_t)vRecords;//SQL查询得到下一条记录的产品ID
temp2="\"";
sql="insertinto产品values(";
sql+=temp+",";
sql+=temp2+m_edit1+temp2+",";
sql+=m_edit2+")";//SQL插入新记录
m_pConnection->Execute(sql.AllocSysString(),&vRecords,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)打开“产品删除”对话框,双击“删除”按钮添加处理函数OnButton1()。
图3-17为删除按钮加入消息处理函数
(2)展开ClassView类视图,在Dialog3类的文件Dialog3.cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):
#include"stdafx.h"
#include"Order_MIS.h"
#include"Dialog3.h"
#import"c:
\ProgramFiles\CommonFiles\System\ADO\msado15.dll"rename_namespace("ADOCG")rename("EOF","EndOfFile")
(3)展开ClassView类视图中,在Dialog3类的CDialog3:
:
OnButton1()函数中添加如下代码(蓝色部分):
voidCDialog3:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData
(1);
ADOCG:
:
_ConnectionPtrm_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(ADOCG:
:
Connection));//创建数据库连接对象
ADOCG:
:
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(ADOCG:
:
Recordset));//创建数据库记录对象
CStringpathName("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=");
pathName+="db1.mdb";
try
{
//数据库连接到当前目录下指定的数据库文件
m_pConnection->Open(pathName.AllocSysString(),"","",ADOCG:
:
adModeUnknown);
}
catch(_com_errore)
{
MessageBox("该路径下没有这个数据库");
}
_variant_tvRecords;
m_pRecordset->Open("select*from产品",_variant_t((IDispatch*)m_pConnection,true),ADOCG:
:
adOpenStatic,ADOCG:
:
adLockOptimistic,ADOCG:
:
adCmdText);//打开数据集
CStringtemp="\"";
CStringsql="deletefrom产品where产品名称=";
sql+=temp+m_edit1+temp;//定义SQL命令字串
MessageBox("确定删除该产品信息?
","确认");
m_pConnection->Execute(sql.AllocSysString(),&vRecords,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)展开ClassView类视图,在Dialog4类的文件Dialog4cpp中头部引入数据库接口文件,添加如下代码(蓝色部分):
#include"stdafx.h"
#include"Order_MIS.h"
#include"Dialog4.h"
#import"c:
\ProgramFiles\CommonFiles\System\ADO\msado15.dll"rename_namespace("ADOCG")rename("EOF","EndOfFile")
(3)展开ClassView类视图,在Dialog4类的CDialog4:
:
OnButton1()函数中添加如下代码(蓝色部分):
voidCDialog4:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData
(1);
ADOCG:
:
_ConnectionPtrm_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(ADOCG:
:
Connection));//创建数据库连接对象
ADOCG:
:
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(ADOCG:
:
Recordset));//创建数据库记录对象
CStringpathName("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=");
pathName+="db1.mdb";
try
{
//数据库连接到当前目录下指定的数据库文件
m_pConnection->Open(pathName.AllocSysString(),"","",ADOCG:
:
adModeUnknown);
}
catch(_com_errore)
{
MessageBox("该路径下没有这个数据库");
}
_variant_tvRecords;
CStringtemp="\"";
CStringsql="select*from产品where产品名称=";
sql+=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()函数中添加如下代码(蓝色部分):
voidCDialog4:
:
OnButton2()
{
//