数据库系统实验报告 ADO连接数据库.docx

上传人:b****9 文档编号:25788392 上传时间:2023-06-14 格式:DOCX 页数:14 大小:187.71KB
下载 相关 举报
数据库系统实验报告 ADO连接数据库.docx_第1页
第1页 / 共14页
数据库系统实验报告 ADO连接数据库.docx_第2页
第2页 / 共14页
数据库系统实验报告 ADO连接数据库.docx_第3页
第3页 / 共14页
数据库系统实验报告 ADO连接数据库.docx_第4页
第4页 / 共14页
数据库系统实验报告 ADO连接数据库.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据库系统实验报告 ADO连接数据库.docx

《数据库系统实验报告 ADO连接数据库.docx》由会员分享,可在线阅读,更多相关《数据库系统实验报告 ADO连接数据库.docx(14页珍藏版)》请在冰豆网上搜索。

数据库系统实验报告 ADO连接数据库.docx

数据库系统实验报告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条记录!

”。

但是点击第二个第三个按钮都没有显示。

原因是另外两个操作的结果虽然已经有了,但是不能显示出来,如果设置了输出窗口,或者提供显示的列表,既可以显示出操作的结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1