版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC中用ADO连接数据库 (2012-04-12 15:50:06)标签: mfc 杂谈分类: MFC一、数据库操作准备1、导入ADO动态链接库 在工程的stdafx.h中加入如下语句: #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
2、0; 这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh和msado15.tli两个C+头文件来定义ADO库,即加载ADO动态库(msado15.dll)。 其中,no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。
3、0; 注意:该代码需要在一行中完成,如果写成两行或者多行,行末要加上“”符号,表示把这几行看成一行,如本例。2、初始化OLE/COM库环境 在基于MFC的应用里,初始化OLE/COM库环境的一个比较好的位置是在应用类的InitInstance成员函数中,而且直接使用AfxOleInit,在退出应用时,该函数也负责COM资源的释放,将此函数添加在InitInstance中的如下位置:BOOL CExpApp:InitInstance(
4、) AfxEnableControlContainer(); /初始化OLE DLLs if(!AfxOleInit() AfxMessag
5、eBox("初始化OLE DLL失败!"); Return FALSE; . 说明:也可以在InitInstance中使用:CoInitialize初始化OLE/COM库环境,但
6、须在ExitInitInstance中使用:CoUninitialize释放占用的COM资源,显然使用AfxOleInit更为方便。3、连接数据库 在DocView程序中,通常在应用类(App类)中进行数据库的连接。 1)声明一个Connection指针 _ConnectionPtr m_pConnection;
7、160; 注:ADO最重要的三个对象有三个:连接对象(Connection)、命令对象(Command)和记录集对象(RecordSet)。在使用这三个对象的时候,需要定义与之相对应的智能指针,分别为_ConnectionPtr、_CommandPtr、_RecordsetPtr。 由上述Connect
8、ionPtr指针的使用步骤可知,和C+中的类指针使用方法一样,智能指针也要先定义指针变量、创建其实例(实例化),然后就可以调用它的方法和属性。不同的是,该智能指针最后是自动进行内存释放的。 所有的智能指针都是基于_com_ptr_t模板类的,该类封装了IUnknow接口的3个方法:QueryInterface、Addref和Release。它具有自动计数的机制
9、,即在构造对象时,自动为该对象计数加1。析构对象时,自动调用Release方法。(即该类型的指针在使用后不需要手动释放内存)(但需要调用Close方法,关闭连接或者记录集)所以智能指针会使代码更加简洁并且不易出错。 2)创建Connection对象 m_pConnection.CreateInstance(_uuidof(Connection);
10、160; m_pConnection.CreateInstance("ADODB.Connection"); 上述两种方法均可。
11、 注意:上面调用_ConnectionPtr接口指针的方法CreateInstance时,用的是“.”而非“->”。 3)设置连接字符串,以便指定需要的连接 3.1) 使用JET数据库引擎实现对Acess2000类型的数据库info.mdb的连接CString strSQL="Provider=Mic
12、rosoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;"或者CString strSQL=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=info.mdb;User ID=admin;Passward=;"); 3.2) 使用OLE DB提供者实现对SQL Server的标准安全连接串s
13、trConnect=_T("Provider=sqloledb;Data Source=MyServerName;" "Initial Catalog=MyDateBaseName;"
14、60; "User ID=MyUserName;Password=MyPassword;");例程:strConnection="Provider=SQLOLEDB;DataSource=local;InitialCatalog=DVDRentDB_Data.MDF;"
15、160; "User ID=sa;Password=820415"m_pConnection->Open(_bstr_t)strSQL,"","",adModeUnknown);或者是在此处不设置User ID和Password,而直接在Open的第2、3个参数中设置。strConnection="Provider=SQLOLEDB
16、;DataSource=local;InitialCatalog=DVDRentDB_Data.MDF"m_pConnection->Open(_bstr_t)strSQL,"sa","820415",adModeUnknown);注意:上面设置连接字符串的时候,如果过长需要分行时,则每一行都要加上双引号,在最后加上分号即可。如果是本地服务器,则DataSource=local或本地服务器名均可若数据库没有设置密码,在连接字符串中可以将其省略,但User ID不能省若数据库和程序文件不在同一文件夹下,直接写数据库名即可,在InitialC
17、atalog中不需加上该数据库的存储器地址 3.3) 使用OLE DB提供者实现对远程SQL Server的标准安全连接串strConnect=_T("Provider=sqloledb;Network Library=DBMSSOCN;"
18、60; "Data Source=130.120.110.001,1433;" "Initial Catalog=MyDateBaseName;"
19、; "User ID=MyUserName;Password=MyPassword;"); 4)、使用m_pConnection的Open方法实现对数据库的连接 在ADO的操作中建议使用tr
20、y.catch( )来捕获错误信息,因为它有时会经常出现一些意想不到的错误try m_pConnection->Open( (_bstr_t) strSQL," "," ",adModeUnknown);catch(_com_error e) /捕捉异常
21、160; CString strError; strError.Format( "连接数据库发生异常! r n错误信息:%s",e.ErrorMessage( ) ); AfxMessageBox(errormessage); /显示错误信息4、关闭连
22、接 一般重载App类的ExitInstace( )函数实现 调用m_pConnection的Close方法关闭连接即可 m_pConnection->Close( ); m_pConnection=NULL; 注意:由于初始化COM库调用的是A
23、fxOleInit,这种方法初始化COM库的优点就在于资源 的释放也是自动进行的,所以不必担心资源泄漏的问题。二、数据库操作 ADO库中包含的三个基本接口为_ConnectionPtr接口、_CommandPtr接口、_RecordsetPtr接口。 1、_ConnectionPtr接口
24、60; 该接口返回一个记录集或一个空指针。 通常用它来创建一个数据库连接,或执行一条不返回任何结果的SQL语句,如一个存储过程。 不推荐使用_ConnectionPtr接口返回一个记录集,对于要返回记录集的操作通常用_RecordsetPtr来实现,而且使用_ConnectionPtr时要想得到记录数目必
25、须遍历所有记录,但使用_RecordsetPtr时则不需要。 2、_CommandPtr接口 该接口返回一个记录集。 它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。 在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果只执行一次或
26、者几次数据库访问操作,后者是比较好的选择。但是,如果频繁访问数据库,并要返回很多记录集,那么应该使用全局_ConnectionPtr接口创建一个数据库连接,然后使用_CommandPtr接口执行存储过程和SQL语句。 3、_RecordsetPtr接口 该接口是一个记录集对象。 与前两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。
27、同_CommandPtr接口一样,它不一定要使用一个已经创建的数据库连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据库连接。如果使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。 注意:可以使用Recordset对象来执行查询命令,但如果查询或者存储过程是需要参数的,这时就只能使用Command对象。
28、160; 使用Recordset对象操作数据库: 假定已经成功使用Connection对象创建了数据源的连接,连接指针为m_pConnection。 1)创建记录集 声明记录集指针
29、0; _RecordsetPtr m_pRecordset; 创建记录集 m_pRecordset.CreateInstance(_uuid
30、of(Recordset); 2)打开记录集 记录集指针创建完毕后,调用该指针的Open方法打开记录集。 该函数声明如下:
31、160; HRESULT Recordset15:Open ( const _variant_t & Source,
32、;
33、; const _variant_t & ActiveConnection, &
34、#160; &
35、#160; enum CursorTypeEnum CursorType,
36、
37、 enum LockTypeEnum LockType,
38、60;
39、60; long Options ) ; 各个参数的含义如下: &
40、#160;参数Source:为_variant_t类型的引用,可以为有效的Command对象、SQL语句、表名、存储过程调用等。 参数ActiveConnection:为_variant_t类型的引用,为已经建立好的连接。 参数Cu
41、rsorType:用于设置在打开Recordset时提供者应使用的游标类型,它可取CursorTypeEnum 中的任一值,默认值为adOpenForwardOnly。 参数 LockType:用于设置在打开Recordset时提供者应使用的锁定类型,它可取枚举LockTypeEnum中的任一值,默认值为adLockReadOnly。 &
42、#160; 参数 Options:用于设置获取Source(即Open第一个参数)的方式,其类型long。 例程1: CString strSQL = "select * from mytablename"
43、0; m_pRecordset->Open ( _variant_t (strSQL),
44、160; m_pConnection.GetInterfacePtr( ),
45、; adOpenDynamic,
46、60;
47、60; adLockOptimistic,
48、0; adCmdText ) ; 使用SQL语句作为Open方法的第一个参数Source的值,此时Options为adCmdText
49、160; 例程2: m_pRecordset->Open ( _variant_t ("tbDVDInfo") ),
50、60; m_pConnection.GetInterfacePtr( ),
51、
52、 adOpenDynamic,
53、0; adLockOptimistic,
54、; adCmdTable ) ;
55、60; 直接使用表名作为第一个参数,此时Options应为adCmdTable 3)遍历记录集 一般在返回记录集时,通常要遍历结果记录集,以便查看或编辑某一条记录,Recoreset指针提供了几个用于实现遍历的方法。
56、60; 注意:为 了避免发生异常,一般在使用MoveFirst、MovePrev之前,需要使用记录集的指针BOF属性来检测当前的记录集指针是否位于第一条记录之前; 在使用MoveLast、MoveNext之前需要使用记录集指针的EOF属性来检测当前的记录集指针是否位于最后一条记录之后。 4)记录集定位 记录集接口类提供了两种定位方法:绝对定位和书签定位
57、 前者通过设置或者获取AbsolutePosition属性即可,其值从1开始,并且当前记录为记录集中第一条记录时等于1 对于后者可以通过设置或获取BookMark属性即可 5)访问记录集
58、 最简单的方法是直接使用如下语句: m_pRecordset->GetCollect (字段名); 设置字段值:
59、0; m_pRecordset->PutCollect (字段名,新值);两个方法的原型:_variant_t GetCollect ( const _variant_t & Index )void PutCollect ( const _variant_t & Index , const _variant_t &pvar )其中:参数Index可以是字符串表示字段名,也可以是整型,表示字段对应的序号。
60、; pvar表示要写入的变量值。例如: _variant_t var; var=m_pRentRecordset->GetCollect("ID"); var=m_pRentRecordset->GetCollect(long(0); 都可以 6)记录集更新
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024搬家服务合同模板含搬家服务增值套餐3篇
- 2024年度三方创业贷款合同范本参考3篇
- 2024年度私人产权数据中心买卖合同范本2篇
- 2024年新型环保通风排烟系统安装与绿色建筑认证合同3篇
- 2024年中国迷你车市场调查研究报告
- 第3课欢欢喜喜庆国庆第二课时教学实录-2023-2024学年道德与法治二年级上册统编版
- 2024年度社区养老项目风险管理与应急预案合同3篇
- 2024年度绿色能源开发与应用合作协议2篇
- 2024年摄影艺术展览合作合同3篇
- 2024年版:离婚案件未成年人抚养权判定合同(含心理辅导)
- 国家开放大学电大《建筑制图基础》机考三套标准题库及答案3
- 降低故障工单回复不合格率
- 可涂色简笔画打印(共20页)
- 灯光架介绍及使用说明
- 十一学校行动纲要
- GB 1886.6-2016 食品安全国家标准 食品添加剂 硫酸钙(高清版)
- 关于房屋征收及土地收储过程中的税收政策(仅供参考)
- 唯一住房补贴申请书(共2页)
- 单面多轴钻孔组合机床动力滑台液压系统课程设计
- 中医养生脾胃为先PPT文档
- 门窗工程成品保护方案(附图)
评论
0/150
提交评论