VC++实现数据库访问.docx
- 文档编号:7055481
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:16
- 大小:64.52KB
VC++实现数据库访问.docx
《VC++实现数据库访问.docx》由会员分享,可在线阅读,更多相关《VC++实现数据库访问.docx(16页珍藏版)》请在冰豆网上搜索。
VC++实现数据库访问
一、数据库连接
1、标准的访问数据库的技术
▲ODBC(OpenDatabaseConnectivity,开发数据库互联)
ODBC为编写关系数据库的客户软件提供了一种统一的接口。
ODBC提供了一个单一的API,可用于处理不同数据库的客户应用程序。
使用ODBCAPI的应用程序可以与任何具有ODBC驱动程序的关系数据库进行通信。
现在,绝大多数关系数据库都提供了ODBC驱动程序,那么我们使用ODBCAPI就可以访问这些数据库。
ODBC的体系结构如下:
我们所编写的客户程序直接和ODBC驱动程序管理器打交道,后者利用ODBC驱动程序所提供的API访问数据库。
在访问不同数据库时,需要指定相应的ODBC驱动程序,而后者又由ODBC程序管理器去调用,它会将客户的请求转换为相应的ODBC驱动,传递给数据库。
▲DAO(DataAccessObject,数据访问对象)
DAO就是一组MicrosoftAccess/Jet数据库引擎的COM自动化接口。
DAO不像ODBC那样是面向C/C++程序员的,它是微软提供给VisualBasic开发人员的一种简单的数据访问方法,用于操作Access数据库。
该技术很少使用,将逐渐退出历史的舞台。
▲RDO(RemoteDataObject,远程数据对象)
由于RDO直接调用ODBCAPI(而不是像DAO那样通过Jet引擎),因此,可以为使用关系数据库的应用程序提供更好的性能。
▲OLEDB(对象链接与嵌入数据库)
OLEDB在两个方面对ODBC进行了扩展。
首先,OLEDB提供了一个数据库编程的COM接口;第二,OLEDB提供了一个可用于关系型和非关系型数据源的接口,而ODBC只能访问关系型数据库。
通常我们所说的数据库都是指关系型和非关系型数据源的接口,而ODBC只能访问关系型数据库。
通常我们所说的数据库都是指关系型数据库。
但是数据库的概念,从广义上来说,除了关系型数据库以外,还包括其他格式的数据源,包括电子表格、文本文件。
OLEDB的两个基本结构式OLEDB提供程序和OLEDB用户程序。
OLEDB的功能非常强大,但是它对自动化的支持不是很好。
OLEDB的体系结构如下:
▲ADO(AcitveXDataObject,ActiveX数据对象)
ADO建立在OLEDB之上。
ADO是一个OLEDB用户程序,即它本身也是一个Consumer。
使用ADO的应用程序都要间接地使用OLEDB。
ADO简化了OLEDB,提供了对自动化的支持,使得像VBScript这样的脚本语言也能使用ADO访问数据库。
采用ADO技术访问数据库的话,实际上调用过程是ADO客户程序通过ADO再访问OLEDB提供程序,所以访问速度要慢些。
但是因为ADO对自动化提供了很好的支持。
该技术很少使用,将逐渐退出历史的舞台。
2、ADO的三个核心对象
▲Connection对象:
Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。
Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
▲Command对象:
Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
▲Recordset对象:
Recordset对象被用来获取数据。
Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。
每一列都存放在Recordset的Fields集合中的一个Field对象中。
3、实例讲解,利用ADO访问数据库
(1)、新建一个基于对话框的MFC工程Ado。
设计ID为IDD_ADO_DIALOG的对话框如下:
(2)、在编译头文件StdAfx.h中导入ADO库:
#import"C:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")。
同时将Access数据库Test.mdb复制到该工程的目录下。
说明:
no_namespace表示不需要命名空间,主要是为了访问方便,在程序中可以直接访问ADO提供的Connection、Command和Recordset这三个COM接口。
rename将EOF改为adoEOF,因为EOF表示记录集的结尾,文件也是以EOF为结尾的,为了避免冲突,在导入ADO库时,需要将EOF该为adoEOF(该名字由自己定义)。
提示:
编译该Ado程序,会在该工程目录下的Debug目录下生成msado15.tlh和msado15.tli,可将msado15.tlh看作是一个头文件,把msado15.tli看作一个源文件。
这两个文件是导入ADO库后,编译器在编译时自动生成的。
(3)、为Query按钮添加单击消息响应函数,利用ADO对象访问数据库:
voidCAdoDlg:
:
OnBtnQuery()
{
CoInitialize(NULL);//初始化COM库
((CListBox*)GetDlgItem(IDC_LIST1))->ResetContent();//清空编辑框中的数据
//_ConnectionPtr是一个智能指针,在msado15.tlh文件中被定义,用该指针定义一个ADOConnection对象,_uuidof获取ADOConnection接口的全局唯一标识符,对pConn对象进行初始化。
_ConnectionPtrpConn(_uuidof(Connection));
_RecordsetPtrpRst(_uuidof(Recordset));//产生一个记录集智能指针对象
//设置连接字符串,不同的数据库使用不同的连接字符串
pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Test.mdb";
pConn->Open("","","",adConnectUnspecified);//上面已经设置了连接字符串,这里所以设置参数为””,adConnectUnspecified表示同步打开连接。
pRst=pConn->Execute("select*fromTest",NULL,adCmdText);//从Test表中取出数据,得到记录集数据
while(!
pRst->adoEOF)
{//获取Name字段的数据
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Name"));
pRst->MoveNext();//让游标向下移动
}
pRst->Close();//关闭记录集
pConn->Close();//关闭连接
pRst.Release();//释放智能指针在相应COM接口的引用计数
pConn.Release();//智能指针在访问其他方法和属性时用箭头指向操作符(->),Release方法释放引用计数时必须使用点操作符(.)。
CoUninitialize();//卸载COM库
}
(4)、使用记录集智能指针对象直接指向SQL查询语句获取记录集数据
将Query按钮的单击消息响应函数OnBtnQuery中的
pRst=pConn->Execute("select*fromTest",NULL,adCmdText);
改为
pRst->Open("select*fromTest",_variant_t((IDispatch*)pConn),
adOpenDynamic,adLockOptimistic,adCmdText);
(5)、使用Command智能指针对象访问数据库
voidCAdoDlg:
:
OnBtnQuery()
{
CoInitialize(NULL);
((CListBox*)GetDlgItem(IDC_LIST1))->ResetContent();
_ConnectionPtrpConn(_uuidof(Connection));
_RecordsetPtrpRst(_uuidof(Recordset));
_CommandPtrpCmd(_uuidof(Command));//构造Command智能指针对象
pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Test.mdb";
pConn->Open("","","",adConnectUnspecified);
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));//设置活动连接
pCmd->CommandText="select*fromTest";//设置Command对象的命令文本属性
pRst=pCmd->Execute(NULL,NULL,adCmdText);//执行Command对象的Execute方法,将结果赋给记录集对象
while(!
pRst->adoEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Name"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}
二、访问数据库,以ACCESS数据库为例
1、创建ACCESS数据库
(1)、打开MicrosoftOfficeAccess,新建Access数据库stu.mdb。
(2)、在stu.mdb中新建一张表stu,在该表中有字符串类型的学号stuNo,字符串类型的姓名stuName、字符串类型的性别stuSex。
其中stuNo是主键。
2、利用ODBC访问Access数据库
(1)、新建单文档类型的MFC工程MFCODBC。
(2)、在向导的第二步,选择【Databaseviewwithoutfilesupport】按钮,再单击【DataSource】按钮。
弹出【DatabaseOptions】对话框,选择【ODBC】单选按钮,然后从下拉列表中选择MSAccessDatabase,单击【OK】按钮,选择创建的Access数据库stu.mdb,其中表选择stu表。
说明:
经过上面步骤,MFC向导自动建立了与ODBC数据源的连接,并将记录集的字段与相应的变量联起来了,具体在MFCODBCSet.h、MFCODBCSet.cpp文件中添加了代码。
(3)、设计IDD_MFCODBC_FORM对话框如下:
该对话框各控件的信息如下:
控件
控件ID
控件属性
控件变量
StuNo:
后的编辑框
IDC_EDIT_NO
默认
CString类型的变量m_strNo
StuName:
后的编辑框
IDC_EDIT_NAME
默认
CString类型的变量m_strName
StuSex:
后的编辑框
IDC_EDIT_SEX
默认
CString类型的变量m_strSex
Insert按钮
IDC_ADD
默认
无
Delete按钮
IDOK_DEL
默认
无
Query按钮
IDC_QUERY
默认
无
Quit按钮
IDCANCEL
默认
无
列表控件(ListControl)
IDC_LIST
Styles选项下,View选择Report
CListCtrl控件类型的变量m_ctrList
(4)、为CMFCODBCView类添加int类型的public变量m_iCount和CMFCODBCSet*类型的public变量m_pSet。
(5)、在程序启动时,需要建立记录集,将记录集中的所有数据读取到列表控件中,即在CMFCODBCView类的OnInitialUpdate函数中添加:
//设置列表风格
m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//设置列表的列名称
m_ctrList.InsertColumn(0,_T("StuNo"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ctrList.InsertColumn(1,_T("StuName"));
m_ctrList.InsertColumn(2,_T("StuSex"));
//获得客户区大小
CRectrect;
GetClientRect(&rect);
//设置列表的列宽度
m_ctrList.SetColumnWidth(0,rect.Width()/3);
m_ctrList.SetColumnWidth(1,rect.Width()/3);
m_ctrList.SetColumnWidth(2,rect.Width()/3);
OnQuery();//查询并显示所有数据
(6)、为Insert按钮添加消息响应函数,在该函数中完成数据的添加:
voidCMFCODBCView:
:
OnAdd()
{
UpdateData();
m_pSet->AddNew();//添加记录
m_pSet->m_stuNo=m_strNo;//添加学号
m_pSet->m_stuName=m_strName;//添加姓名
m_pSet->m_stuSex=m_strSex;//添加性别
m_pSet->Update();//更新记录
m_pSet->Requery();//重新执行查询
m_pSet->MoveLast();//移动到最后一条记录
OnQuery();
}
说明:
m_pSet指向的记录字段可以在MFCODBCSet.h中看到。
(7)、为Delete按钮添加消息响应函数,在该函数中完成数据的删除:
voidCMFCODBCView:
:
OnDel()
{
m_pSet->Delete();//删除最后一条记录
m_pSet->Requery();//重新执行查询
OnQuery();//查询并显示所有数据
}
(8)、为Query按钮添加消息响应函数,在该函数中完成数据的查询:
voidCMFCODBCView:
:
OnQuery()
{
m_ctrList.DeleteAllItems();//删除列表中的所有记录
m_iCount=0;//初始化记录数
m_pSet->MoveFirst();//移动到记录集的第一条
while(!
m_pSet->IsEOF())//判断是否到了记录集的结尾
{//读取记录并将其插入列表中
m_ctrList.InsertItem(m_iCount,m_pSet->m_stuNo,0);
m_ctrList.SetItemText(m_iCount,1,m_pSet->m_stuName);
m_ctrList.SetItemText(m_iCount,2,m_pSet->m_stuSex);
m_iCount++;//增加记录序号
m_pSet->MoveNext();//移动到下一条记录
}
m_pSet->MoveLast();//移动到最后一条记录
}
3、利用ADO访问Access数据库
(1)、新建基于对话框的MFC工程MFCAdo。
(2)、设计对话框IDD_MFCADO_DIALOG如下:
该对话框各控件的信息如下:
控件
控件ID
控件属性
控件变量
StuNo:
后的编辑框
IDC_EDIT_NO
默认
CString类型的变量m_strNo
StuName:
后的编辑框
IDC_EDIT_NAME
默认
CString类型的变量m_strName
StuSex:
后的编辑框
IDC_EDIT_SEX
默认
CString类型的变量m_strSex
Insert按钮
IDC_ADD
默认
无
Update按钮
IDC_UPDATE
默认
无
Delete按钮
IDOK_DEL
默认
无
Query按钮
IDC_QUERY
默认
无
Quit按钮
IDCANCEL
默认
无
列表控件(ListControl)
IDC_LIST
Styles选项下,View选择Report
CListCtrl控件类型的变量m_ctrList
(3)、导入ADO库,在头文件StdAfx.h中添加:
#import"C:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
(4)、初始化COM库,在CMFCAdoApp类的InitInstance函数中添加:
CoInitialize(NULL);
(5)、为CMFCAdoDlg类头文件中定义智能指针变量,用于操作数据库:
public:
_ConnectionPtrm_pConnection;//数据库连接指针
_RecordsetPtrm_pRecordset;//数据库记录集指针
(6)、为CMFCAdoDlg类添加OpenDatabase成员函数用于数据库的连接和表的打开:
BOOLCMFCAdoDlg:
:
OpenDatabase(constCStringstrSQL)
{
_bstr_tstrConnect;//连接字符串变量定义
strConnect="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=stu.mdb";
HRESULThr;//返回值变量定义
//连接并打开数据库
try
{//创建Connection对象
hr=m_pConnection.CreateInstance(_uuidof(Connection));
if(SUCCEEDED(hr))
{//若Connection对象创建成功,连接数据库
hr=m_pConnection->Open(strConnect,"","",adModeUnknown);
}
}
catch(_com_errore)
{//捕获异常
CStringerrormessage;//错误信息变量定义
errormessage.Format("Connectdatabasefail!
\r\nerrormessageis:
%s",e.ErrorMessage());//连接数据库失败,格式化错误信息
AfxMessageBox(errormessage);//显示错误信息
returnFALSE;//发生异常,返回
}
//打开表
try
{
m_pRecordset.CreateInstance(_uuidof(Recordset));//创建RecordSet对象
m_pRecordset->CursorType=adOpenStatic;//指定游标类型
m_pRecordset->CursorLocation=adUseClient;//指定游标位置
m_pRecordset->Open((_variant_t)strSQL,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);//打开表
}
catch(_com_errore)
{
CStringerrormessage;
errormessage.Format("Opendatabasefail!
\r\nerrormessageis:
%s",e.ErrorMessage());
AfxMessageBox(errormessage);
returnFALSE;
}
returnTRUE;
}
(7)、为CMFCAdoDlg类添加CloseDatabase成员函数,关闭数据库:
voidCMFCAdoDlg:
:
CloseDatabase()
{
if(m_pConnection->State)
{//若数据库已经打开,则关闭
m_pConnection->Close();
}
}
(8)、在CMFCAdoDlg类的OnInitDialog函数中初始化列表控件并将数据库中的数据显示到列表控件中:
//初始化用户信息列表控件
:
:
SendMessage(m_ctrList.m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,
LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
CRectrect;
m_ctrList.GetClientRect(&rect);//获得列表控件区域
m_ctrList.InsertColumn(0,"StuNo",LVCFMT_LEFT,rect.Width()/3);//添加学号列
m_ctrList.InsertColumn(1,"StuName",LVCFMT_LEFT,rect.Width()/3);
m_ctrList.InsertColumn(2,"StuSex",LVCFMT_LEFT,rect.Width()/3);
//在列表中显示所有用户信息
intiItem=0;
CStringstrSQL="select*fromstu";
OpenDatabase(strSQL);//连接并打开数据库和表
while(!
m_pRecordset->adoEOF)
{//读取记录并将数据插入到列表控件中
iItem=m_ctrList.InsertItem(0xffff,(_bstr_t)(m_pRecordset->GetCollect("StuNo")));
m_ctrList.SetItem(iItem,1,1,(_bstr_t)(m_pRecordset->GetCollect("StuName")),NULL,0,0,0);
m_ctrList.SetItem(iItem,2,1,(_bstr_t)(m_pRecordset->GetCollect("StuSex")),NULL,0,0,0);
m_pRecordset->MoveNext();//移动记录集指针
}
CloseDatabase();//关闭数据库
(9)、为Add按钮添加消息响应函数,在该函数中完成数据的添加:
voidCMFCAdoDlg:
:
OnAdd()
{
UpdateData();
//将数据写入数据库
CStringstrSQL="select*fromstu";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 实现 数据库 访问
![提示](https://static.bdocx.com/images/bang_tan.gif)