实验15简单数据库的应用程序开发.docx
《实验15简单数据库的应用程序开发.docx》由会员分享,可在线阅读,更多相关《实验15简单数据库的应用程序开发.docx(18页珍藏版)》请在冰豆网上搜索。
实验15简单数据库的应用程序开发
实验15简单数据库应用程序开发
一、目的与要求:
1)了解实际数据库应用系统的开发过程;
2)掌握ODBC数据源的建立方法;
3)掌握在不同开发工具中使用ODBC或ADO等技术连接数据库的基本方法;
4)初步掌握数据库应用程序的基本方法;
5)开发一个简单的数据库应用程序。
二、背景知识
用户与DBMS交互,一种方式是直接借助DBMS系统,采用SQL命令进行,另一种方式是用户通过数据库应用程序与DBMS交互,对非计算机专业用户来说,这是最简单的方式。
数据库应用程序通过一定方式与数据库建立连接,然后与DBMS建立交互。
数据库应用程序的开发是信息系统建设的重要组成部分。
数据库应用程序与DBMS可以通过一系列的应用程序接口(ApplicationProgrammingInterface,API)进行通信,通过API调用传递SQL语句给DBMS,并使用API调用检索结果。
常用的数据库应用编程接口有ODBC、JDBC、ADO、ADO.NET和OLEDB等。
目前数据库应用系统开发中通常使用两种体系结构即客户机/服务器(Client/Server,C/S)结构和浏览器/服务器(Browser/Server,B/S)结构。
C/S结构的服务器上安装数据库及数据库管理系统,用于执行DBMS功能,称为数据库服务器;而客户机则安装DBMS的外围应用开发工具即客户端应用程序,支持用户的应用,称为客户机。
一般系统由一台数据库服务器和多台客户机组成。
B/S结构是随着数据库应用系统规模的扩大和Internet的迅速普及而产生的体系结构,在B/S结构中,客户机上只要安装浏览器如InternetExplORer或NetscapeNavigatOR,数据库服务器上安装DBMS和数据库,用户界面完全通过WWW浏览器实现,应用逻辑在Web服务器端实现。
浏览器通过Web服务器同数据库进行数据交互。
数据库应用系统的体系结构不同,其开发工具也有所不同。
目前比较主流的C/S结构前端开发工具有Delphi、VisualBasic、VisualBasic.NET、VisualC++、JAVA和PowerBuilder等。
而B/S结构的开发工具有ASP、ASP.NET、JSP和PHP等。
在开发工具中通常可以通过API如ODBC、JDBC、ADO、ADO.NET和OLEDB等接口建立与后台数据库的连接。
三、实验内容
开发一个简单的数据库应用系统,针对EDUC数据库,开发其简单的应用程序界面,能够对其中的表数据进行操作。
系统采用C/S体系结构,客户端负责提供表达逻辑、显示用户界面信息、访问数据库服务器,自选一种开发工具(VisualC++,VisualBasic或Delphi);服务器端则用于提供数据服务,采用SQLServer2005作为数据库管理系统。
四、实验步骤
选择的开发工具不同,应用程序与数据库的连接方式及应用程序的编写方式就不同,下面列举在VisualC++工具下简单应用界面的设计方法。
1.建立ODBC数据源
在介绍具体方案之前,先为EDUC数据库建立ODBC数据源。
方法如下:
(1)在WindowsXP中选择“开始”|“控制面板”|“管理工具”命令,出现如图15-1所示的“管理工具”窗口。
图15-1“管理工具”窗口图15-2“系统DSN”选项卡窗口
(2)双击“ODBC数据源”,打开“ODBC数据源管理器”对话框;选择“系统DSN”选项卡,如图15-2所示。
(3)单击“添加”按钮,出现如图15-3所示的对话框;选择SQLServer选项,单击“完成”按钮。
(4)出现“创建到SQLServer的新数据源”对话框,如图15-4所示;在“名称”文本框中输入XSGL,单击“下一步”按钮。
图15-3“创建新数据源”对话框图15-4“创建到SQLServer的新数据源”对话框
(5)出现连接SQLServer认证的输入框,选择“使用用户输入登录ID和密码的SQLServer验证”单选按钮,在“登录ID”文本框中输入sa,在“密码”文本框中输入服务器登录密码,单击“下一步”按钮,进入选择数据库的对话框。
(6)选中“更改默认的数据库为”复选框,从其下方的下拉列表框中选择数据库为XSGL,不更改其他默认设置。
设置完毕后,单击“下一步”按钮,进入设置ODBC对话框,如图15-5所示。
保持默认选项,单击“完成”按钮,
(7)出现ODBC配置的确认对话框,如图15-6所示。
单击“测试数据源”按钮,即弹出一个关于测试结果对话框,单击“确定”按钮。
如果测试成功,则表示ODBC数据源educ已经建成。
图15-5“创建到SQLServer的新数据源”对话框图15-6ODBC配置确认对话框
2.建立数据库应用程序
数据源建立后,可进行简单数据库应用程序的编写。
选择应用程序开发工具,然后实现如下功能:
(1)系统欢迎界面;
(2)登录界面;
(3)应用程序主界面(菜单、工具栏等);
(4)应用程序的其它界面如数据维护、数据查询、数据统计等;
(5)报表设计;
…….
对于数据访问界面,一般的步骤如下:
(1)建立工程项目;
(2)界面窗口设计;添加数据库连接控件。
(3)添加数据显示控件。
(4)修改控件属性,把控件和数据库绑定。
(5)利用控件直接操作数据库。
(6)退出宿主语言后,在DBMS环境下观察数据库的变化。
(7)在开发工具编程环境下为事件增加程序代码,实现对数据库的操纵。
具体方法请参阅相关开发工具的参考书。
下面分别介绍几种不同开发工具下与数据库连接的方法和简单应用程序界面设计的基本方法。
包括增加新的记录、删除记录、修改记录。
方案一:
采用VisualC++作为前端开发工具
在VC下开发基于ADO的数据库要稍微复杂一些,本次开发基于c/s体系结构的学生选课管理系统,采用三层模式进行开发。
即数据层,业务层,界面层。
下面关于开发的一些基本步骤作一个简单介绍:
(1)导入ADO动态链接库msado15.dll到“StdAfx.h”文件中,以便工程编译完后,自动生成对ADO对象的封装:
添加步骤:
(Ⅰ)根据安装系统盘的路径,查找到c:
\programfiles\commonfiles\system\ado\msado15.dll文件
(Ⅱ)在“StdAfx.h”文件中,添加一条语句:
#impORt"c:
\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
说明:
(A)重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。
(B)ADO类的定义是作为一种资源存储在ADODLL(msado15.dll)中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COMvtable接口。
当使用#impORt指令时,在运行时VisualC++需要从ADODLL中读取这个类型库,并以此创建一组C++头文件。
这些头文件具有.tli和.tlh扩展名,读者可以在项目的DEBUG目录下找到这两个文件。
在C++程序代码中调用的ADO类要在这些文件中定义。
(2)建立数据层类,实现与数据库的连接、数据插入、删除、查询、数据更新操作。
classADOConn
{
public:
_ConnectionPtrm_pConnection;//添加一个指向Connection对象的指针
_RecORdsetPtrm_pRecORdset;//添加一个指向RecORdset对象的指针
//定义各种方法,实现数据库的连接,数据的查询,数据的增删改
ADOConn();
virtual~ADOConn();
voidOnInitADOConn();//初始化连接
_RecORdsetPtr&GetRecORdSet(_bstr_tbstrSQL);//执行查询
BOOLExecuteSQL(_bstr_tbstrSQL);//执行增删改SQL语句,InsertUpdate_variant_t
voidExitConnect();//退出数据库连接
};
ADOConn:
:
ADOConn()
{
}
ADOConn:
:
~ADOConn()
{
}
//初始化数据库连接方法
voidADOConn:
:
OnInitADOConn()
{
//初始化OLE/COM库环境,由于ADO库是一组COM动态库,应用程序在调用ADO前,必须先初始化OLE/COM库环境,以便使调用COM的API工作正常。
:
:
CoInitialize(NULL);
try
{m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
//设置连接字符串,提供DBMS名称,数据库服务器所在位置,数据库的名称,用户名,口令
_bstr_tstrConnect="driver={SQLServer};Server=127.0.0.1;DATABASE=XSGL;UID=sa;PWD=;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
//捕捉异常
catch(_com_errORe)
{AfxMessageBox(e.Description());}
}
//对数据库执行查询的方法
_RecORdsetPtr&ADOConn:
:
GetRecORdSet(_bstr_tbstrSQL)//将查询表达式作为参数传递
{
try
{
//连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//创建记录集对象
m_pRecORdset.CreateInstance("ADODB.RecORdset");
//取得表中的记录
m_pRecORdset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
//捕捉异常
catch(_com_errORe)
{AfxMessageBox(e.Description());}
//返回记录集指针
returnm_pRecORdset;
}
//对数据库执行插入、删除、数据更新操作SQL命令的方法
BOOLADOConn:
:
ExecuteSQL(_bstr_tbstrSQL)//将SQL命令作为参数传递
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
returntrue;
}
catch(_com_errORe)
{
AfxMessageBox(e.Description());
returnfalse;
}
}
voidADOConn:
:
ExitConnect()
{
//关闭记录集和连接
if(m_pRecORdset!
=NULL)
m_pRecORdset->Close();
m_pConnection->Close();
//释放环境
:
:
CoUninitialize();
}
(3)建立业务层:
在XSGL信息系统中,学生表有插入、删除、数据更新这样的业务需求,因此,对数据库中的课程表建立一个课程业务类,封装相应的方法,以保证数据能够正确操作。
同样,课程表与选课表也有类似的业务需求,也需要建立相应的业务类。
classcourse
{
public:
CStringcno,cname,tname,room;//对应表中的字段
intcredit;//对应表中的字段
course();
virtual~course();
voidsql_insert();
voidsql_delete(CStringicno);
voidsql_update(CStringicno);
//按课程编号,判断是否存在相同纪录
inthavecno(CStringicno);
};
#include"ADOConn.h"
course:
:
course()
{}
course:
:
~course()
{}
//课程业务类插入数据的接口,在此接口中,调用数据层类,将数据插入到数据库中
voidcourse:
:
sql_insert()
{
ADOConnadoconn;
adoconn.OnInitADOConn();
_bstr_tsqltemp;
CStringtempcredit;//_bstr_t中只支持字符串的相加操作,所以必须把数值转换成字符串
tempcredit.FORmat("%f",credit);
sqltemp="insertintocoursevalues('"+cno+"','"+cname+"','"+tname+"',"+tempcredit+",'"+room+"')";
adoconn.ExecuteSQL(sqltemp);
adoconn.ExitConnect();
}
//课程业务类删除数据的接口,在此接口中,调用数据层类,将数据从数据库中删除
voidcourse:
:
sql_delete(CStringicno)
{
ADOConnadoconn;
adoconn.OnInitADOConn();
_bstr_tsqltemp;
sqltemp="deletefromcoursewherecno='"+icno+"'";
adoconn.ExecuteSQL(sqltemp);
adoconn.ExitConnect();
}
//课程业务类更新数据的接口,在此接口中,调用数据层类,更新数据库中的数据
voidcourse:
:
sql_update(CStringicno)
{
ADOConnadoconn;
adoconn.OnInitADOConn();
_bstr_tsqltemp;
sqltemp="updatecoursesetcname='"+cname+"',tname='"+tname+"'wherecno='"+icno+"'";
adoconn.ExecuteSQL(sqltemp);
adoconn.ExitConnect();
}
//按课程编号,判断是否存在相同纪录
intcourse:
:
havecno(CStringicno)
{
//根据当前用户输入的课程号,判断能否插入当前记录;如果存在,重新输入,否则插入
ADOConnadoconn;
_bstr_tsql;
sql="select*fromcoursewherecno='"+icno+"'";
_RecORdsetPtrm_precORdset;
m_precORdset=adoconn.GetRecORdSet(sql);
if(m_precORdset->adoEOF)
return-1;
else
return1;
adoconn.ExitConnect();
}
(4)建立表示层:
针对业务需求,建立相应的窗体,如:
课程(学生、选课)输入、修改、删除窗体,这类窗体和数据库的数据传递,通过相应的业务类实现,所有信息的查询窗体,可以通过DataGrid控件较轻松地实现。
(Ⅰ)添加课程记录界面的实现
(A)首先建立如图15-22所示的对话窗
图15-22添加课程纪录界面
(B)在与对话窗对应的类interface_course中,添加如下所示的成员变量:
CStringm_cno;
CStringm_cname;
CStringm_cteacher;
intm_credit;
CStringm_room;
//在插入控件响应函数中,添加如下的代码:
voidinterface_course:
:
OnInsert()
{
UpdateData
(1);//获得用户界面输入的信息
coursetemp;//定义课程类的对象
if(m_cno=="")
{
MessageBox("课程编号不能为空");
return;
}
if(m_cname=="")
{
MessageBox("课程名不能为空");
return;
}
if(m_cteacher=="")
{
MessageBox("任课教师不能为空");
return;
}
if(m_credit==0)
{
MessageBox("学分不能为空");
return;
}
if(m_credit>5&&m_credit<0)
{
MessageBox("学分必须在0.5-5的范围内");
return;
}
if(m_room=="")
{
MessageBox("教室不能为空");
return;
}
if(temp.havecno(m_cno)==1)
{
MessageBox("该课程编号已存在");
return;
}
o=m_cno;
ame=m_cname;
temp.credit=m_credit;
temp.tname=m_cteacher;
temp.room=m_room;
temp.sql_insert();//调用课程类对象的插入函数,将表示层数据传送到数据库中
if(temp.havecno(m_cno)==1)
{
MessageBox("添加成功!
");
}
elseMessageBox("添加失败!
");
//CDialog:
:
OnOK();
}
说明:
课程的删除、修改方法与此类似,不再详细介绍。
(Ⅱ)查询界面的实现
查询的实现,可以通过使用ADODATA等控件方法实现,减少编程代码,同时,为了减少网络流量,建议使用存储过程,因为存储过程是在服务器端实现的,只需要传递用户需要的数据。
下面介绍“按学生名模糊查询学生名单”的设计及实现方法。
图15-23按学生名模糊查询学生窗体
(A)首先建立如图所示的对话窗
(B)在与对话窗对应的类interface_snamechaxun中,添加如下所示的成员变量:
CStringm_sname;
CAdodcm_ad;
//在查询控件响应函数中,添加如下的代码:
voidinterface_snamechaxun:
:
Onchaxun()
{
UpdateData
(1);
CStringsql="execchaxun_student_name'%"+m_sname+"%'";
m_ad.SetRecORdSource(sql);
m_ad.Refresh();
}
说明:
CAdodc,CDataGrid,CDataCombo控件的使用请学生参考其他书籍
3.典型的数据库应用系统主要界面-教材管理信息系统
选择一种开发工具,按照教材信息管理系统的界面设计学生管理系统的欢迎界面、登录界面、应用程序主界面、数据查询界面和各管理业务界面,教材信息管理系统的界面如图15-24至15-28所示。
图15-24系统欢迎界面图15-25登录界面
图15-26应用程序主界面图15-27数据查询界面
图15-28教材管理业务界面
方案二:
采用VisualC++和ODBC开发数据库应用程序
请参考我上传的VC数据库编程ppt