数据库系统实验报告 ADO连接数据库.docx
《数据库系统实验报告 ADO连接数据库.docx》由会员分享,可在线阅读,更多相关《数据库系统实验报告 ADO连接数据库.docx(14页珍藏版)》请在冰豆网上搜索。
数据库系统实验报告ADO连接数据库
《数据库系统概论》实验报告
题目:
实验5ADO连接数据库
班级
姓名
学号
日期
2014年6月9日
一、实验目的
1.在VC开发环境下使用ADO技术连接数据库
2.分别使用Connection、Command和Recordset对象实现对数据库的查询
二、实验平台
VisualC++6.0开发环境,数据库为微软SQLServer2000或以上版本。
由于本次试验计算机软件配置原因,该实验是在VisualStdio2008平台上进行的。
三、实验内容和要求
通过VC6的应用程序向导创建一个对话框应用程序,使用ADO连接数据库。
在对话框上放置三个按钮,分别为使用Connection、Command和Recordset对象实现对数据库的查询。
实现每个对话框的事件处理函数,在每个函数中分别通过Connection、Command和Recordset对象实现对数据库的查询。
四、实验步骤
1.先在VisualStudio2008中新建一个项目,在左边项目类型列表的“其他语言”选项中选择“VisualC++”,然后在右边的模板窗口中选择建立MFC应用程序,我将此工程命名为AdoConnection。
点击确定即可。
如下图4-1新建项目所示:
2.以管理员sa登录数据库,新建MyDB数据库,然后运行如下SQL语句,创建前几次实验所建立的表。
图4-1新建项目
CREATETABLEcourse(
Cnochar(4)NOTNULL,
Cnamechar(40)DEFAULTNULL,
Cpnochar(4)DEFAULTNULL,
CcreditsmallintDEFAULTNULL,
PRIMARYKEY(Cno)
);
--
--转存表中的数据'course'
--
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('1','数据库','5',4);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('2','数学',NULL,2);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('3','信息系统','1',4);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('4','操作系统','6',3);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('5','数据结构','7',4);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('6','数据处理',NULL,2);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('7','PASCAL语言','6',4);
INSERTINTOcourse(Cno,Cname,Cpno,Ccredit)VALUES
('8','DB_DESIGN','1',2);
--
--表的结构'sc'
--
CREATETABLEsc(
Snochar(9)NOTNULLDEFAULT'',
Cnochar(4)NOTNULLDEFAULT'',
GradesmallintDEFAULTNULL,
PRIMARYKEY(Sno,Cno),
);
--
--转存表中的数据'sc'
--
INSERTINTOsc(Sno,Cno,Grade)VALUES
('200215121','1',92);
INSERTINTOsc(Sno,Cno,Grade)VALUES
('200215121','2',85);
INSERTINTOsc(Sno,Cno,Grade)VALUES
('200215121','3',88);
INSERTINTOsc(Sno,Cno,Grade)VALUES
('200215122','2',90);
INSERTINTOsc(Sno,Cno,Grade)VALUES
('200215122','3',80);
----------------------------------------------------------
--
--表的结构'student'
--
CREATETABLEstudent(
Snochar(9)NOTNULL,
Snamechar(20)DEFAULTNULLUNIQUE,
Ssexchar
(2)DEFAULTNULL,
SagesmallintDEFAULTNULL,
Sdeptchar(20)DEFAULTNULL,
PRIMARYKEY(Sno),
)
--
--转存表中的数据'student'
--
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
('200215121','李勇','男',20,'CS');
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
('200215122','刘晨','女',19,'CS');
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
('200215123','王敏','女',18,'MA');
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
('200215125','张立','男',19,'IS');
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
('200215128','陈冬','男',18,'IS');
--
--限制表'course'
--
ALTERTABLEcourse
ADDCONSTRAINTcourse_ibfk_1FOREIGNKEY(Cpno)REFERENCEScourse(Cno);
--
--限制表'sc'
--
ALTERTABLEsc
ADDCONSTRAINTsc_ibfk_1FOREIGNKEY(Sno)REFERENCESstudent(Sno);
ALTERTABLEsc
ADDCONSTRAINTsc_ibfk_2FOREIGNKEY(Cno)REFERENCEScourse(Cno);
3.在应用程序AdoConnection类的InitInstance()函数中添加如下语句,初始化COM库
AfxOleInit();
首先找到源文件AdoConnection.cpp。
然后如下图所示,在InitInstance()函数中,添加语句AfxOleInit();来初始化COM库:
4.在stdafx.h中加入如下语句引入ADO类库
#import"c:
\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
几点说明:
(1) msado15.dll所在的目录
(2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405) :
warning C4146:
unary minus operator applied to unsigned type, result
5.在应用程序的Dlg类的定义中增加三个成员变量:
_ConnectionPtrm_pConnection;
_RecordsetPtrm_pRecordset;
_CommandPtrm_pCommand;
先找到AdoConnection.h头文件,成员变量要添加在头文件中。
如下图所示:
6.在应用程序的Dlg类的OnInitDialog()函数中末尾添加如下语句:
HRESULThr;
try
{
hr=m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr=m_pConnection->Open("Driver=SQLServer;Server=localhost;Database=MyDB;UID=sa;PWD=1","","",adModeUnknown);
}
}
catch(_com_errore)///捕捉异常
{
CStringerrormessage;
errormessage.Format("连接数据库失败!
\r\n错误信息:
%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
注意:
上面语句中的数据库的名称和用户名密码要根据实际情况来填写。
m_pConnection->Open("Driver=SQLServer;Server=localhost;Database=127.0.0.1;UID=sa;PWD=1","","",adModeUnknown);
在AdoConnectionDlg.cpp中找到OnInitDialog()函数。
如下图所示:
7.在对话框上添加三个按钮,设置按钮上的标题分别为:
“使用Connection对象访问数据库”、“使用Command对象访问数据库”和“使用RecordSet对象访问数据库”。
8.分别双击三个按钮,进入到每个按钮的事件处理函数中,添加如下语句,测试与数据库的查询。
(1)Connection对象
_variant_tRecordsAffected;
m_pRecordset=m_pConnection->Execute("SELECTCOUNT(*)FROMstudent",&RecordsAffected,adCmdText);
_variant_tvIndex=(long)0;
_variant_tvCount=m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
m_pRecordset->Close();///关闭记录集
CStringmessage;
message.Format("共有%d条记录",vCount.lVal);
AfxMessageBox(message);///显示当前记录条数
如下图所示,在OnBnClickedButton1()函数中添加代码:
(2)Command对象
m_pCommand.CreateInstance("ADODB.Command");
_variant_tvNULL;
vNULL.vt=VT_ERROR;
vNULL.scode=DISP_E_PARAMNOTFOUND;///定义为无参数
m_pCommand->ActiveConnection=m_pConnection;///非常关键的一句,将建立的连接赋值给它
m_pCommand->CommandText="SELECT*FROMstudent";///命令字串
m_pRecordset=m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
_variant_tvName,vAge,vDept,vSex;
while(!
m_pRecordset->adoEOF)///这里为什么是adoEOF而不是EOF呢?
还记得rename("EOF","adoEOF")这一句吗?
{
vName=m_pRecordset->GetCollect(_variant_t((long)1));///取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
vAge=m_pRecordset->GetCollect("sage");///取得username字段的值
vDept=m_pRecordset->GetCollect("sdept");
vSex=m_pRecordset->GetCollect("ssex");
///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
if(vName.vt!
=VT_NULL&&vAge.vt!
=VT_NULL&&vDept.vt!
=VT_NULL&&vSex.vt!
=VT_NULL)
TRACE("姓名:
%s,性别:
%s,年龄:
%d,所在系:
%s\r\n",
(LPCTSTR)(_bstr_t)vName,
(LPCTSTR)(_bstr_t)vSex,
vAge.lVal,
(LPCTSTR)(_bstr_t)vDept);
m_pRecordset->MoveNext();///移到下一条记录
}
m_pRecordset->Close();
如下图所示,在OnBnClickedButton2()函数中添加代码:
(3)RecordSet对象
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT*FROMstudent",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
_variant_tvName,vAge,vDept,vSex;
while(!
m_pRecordset->adoEOF)///这里为什么是adoEOF而不是EOF呢?
还记得rename("EOF","adoEOF")这一句吗?
{
vName=m_pRecordset->GetCollect(_variant_t((long)1));///取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
vAge=m_pRecordset->GetCollect("sage");///取得username字段的值
vDept=m_pRecordset->GetCollect("sdept");
vSex=m_pRecordset->GetCollect("ssex");
///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
if(vName.vt!
=VT_NULL&&vAge.vt!
=VT_NULL&&vDept.vt!
=VT_NULL&&vSex.vt!
=VT_NULL)
TRACE("姓名:
%s,性别:
%s,年龄:
%d,所在系:
%s\r\n",
(LPCTSTR)(_bstr_t)vName,
(LPCTSTR)(_bstr_t)vSex,
vAge.lVal,
(LPCTSTR)(_bstr_t)vDept);
m_pRecordset->MoveNext();///移到下一条记录
}
///添加1条新记录并赋值
try{
m_pRecordset->AddNew();///添加新记录
m_pRecordset->PutCollect("sno",_variant_t("201400015"));
m_pRecordset->PutCollect("sname",_variant_t("李四4"));
m_pRecordset->PutCollect("ssex",_variant_t("男"));
m_pRecordset->PutCollect("sage",_variant_t((long)18));
m_pRecordset->PutCollect("sdept",_variant_t("CS"));
}
catch(_com_errore)///捕捉异常
{
CStringerrormessage;
errormessage.Format("AddNew!
\r\n错误信息:
%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
m_pRecordset->PutCollect(_variant_t("sage"),_variant_t((long)46));///修改其年龄
m_pRecordset->Update();///保存到库中
//m_pRecordset->Close();
/*m_pRecordset->MoveLast();///移到首条记录
try{
m_pRecordset->Delete(adAffectCurrent);///删除当前记录
}
catch(_com_errore)///捕捉异常
{
CStringerrormessage;
errormessage.Format("删除!
\r\n错误信息:
%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}*/
如下图所示,在OnBnClickedButton3()函数中添加代码:
出现的问题及解决方案:
1、在操作第三步时,我没有找到实验指导书上的应用程序App类,后来才知道这里的App类就是我所建立的AdoConnection类,并且在InitInstance()函数中添加AfxOleInit();是在cpp文件中添加的。
所以进行实验的时候不熟练和陌生让一开始的时候实验比较艰难。
2.在进行操作第5步时,要求在应用程序的Dlg类的定义中增加三个成员变量,这里的Dlg类我认为就是我的AdoConnectionDlg类。
一开始我把三个成员变量定义在了cpp文件中,后来运行时程序报错,提示没有定义变量,后来才发现,应该把成员变量定义在头文件中。
3.第6步,在应用程序的Dlg类的OnInitDialog()函数中末尾添加下列语句时,m_pConnection->Open("Driver=SQLServer;Server=localhost;Database=MyDB;UID=sa;PWD=1","","",adModeUnknown);
上面语句中的数据库的名称和用户名密码要根据实际情况来填写。
但是这样写,同时也改变了SQL数据库的设置后,还是会提示“连接数据库失败!
”在询问了老师以后,把MyDB数据库改成127.0.0.1地址后,就可以成功连接数据库了。
m_pConnection->Open("Driver=SQL
Server;Server=localhost;Database=127.0.0.1;UID=sa;PWD=1","","",adModeUnknown);
4、连接成功后,在窗口点击Connection按钮以后,弹出窗口提示“共有6条记录!
”。
但是点击第二个第三个按钮都没有显示。
原因是另外两个操作的结果虽然已经有了,但是不能显示出来,如果设置了输出窗口,或者提供显示的列表,既可以显示出操作的结果。