ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同Cdatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。

_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
,然后使用_RecordsetPtr执行存储过程和SQL语句。 

stdafx.h   中加入

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 
中才能引用这三个指针

void CSjtestDlg::OninitADOConn(void)
{
try{
//创建连接对象实例
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串
CString strConnect=_T("DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=;DBQ=shujuku.mdb;");
//使用 Open 方法连接数据库
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(_T("连接数据失败,请检查数据库路径是否正确!"));
}
} void CSjtestDlg::ExitConnect(void)
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
}

  

       m_Grid.InsertColumn(0,_T("员工编号"),LVCFMT_LEFT,80,0);
m_Grid.InsertColumn(1,_T("员工姓名"),LVCFMT_LEFT,80,1);
m_Grid.InsertColumn(2,_T("所属部门"),LVCFMT_LEFT,80,2);
m_Grid.InsertColumn(3,_T("基本工资"),LVCFMT_LEFT,80,3);
//连接数据库
OninitADOConn() ;
//设置查询字符串
_bstr_t bstrSQL = "select * from employees order by 员工编号 desc";
//创建记录集指针对象实例
m_pRecordset.CreateInstance(__uuidof(Recordset));//该句也可以使用 m_pRecordset.CreateInstance(“ADODB.Recordset”);代替打开记录集
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
m_Grid.InsertItem(0,_T(""));
m_Grid.SetItemText(0,0,(_bstr_t)m_pRecordset->GetCollect(_T("员工编号")));
m_Grid.SetItemText(0,1,(_bstr_t)m_pRecordset->GetCollect(_T("员工姓名")));
m_Grid.SetItemText(0,2,(_bstr_t)m_pRecordset->GetCollect(_T("所属部门")));
m_Grid.SetItemText(0,3,(_bstr_t)m_pRecordset->GetCollect(_T("基本工资")));
//将记录集指针移动到下一条记录
m_pRecordset->MoveNext();
} //断开数据库连接
ExitConnect();

  

ADOConn.h

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 

#pragma once
class ADOConn
{
public:
_ConnectionPtr m_pConnection; //连接对象指针
_RecordsetPtr m_pRecordset; //记录集对象指针
public :
ADOConn(void);
~ADOConn(void);
void OnInitADOConn() ; //连接数据库
BOOL ExecuteSQL(_bstr_t bstrSQL) ; //执行SQL语句
_RecordsetPtr & GetRecordSet(_bstr_t bstrSQL) ; //执行SQL查询并返回记录集指针
void ExitConnect() ; //关闭记录集便断开数据连接
};

ADOConn.cpp

#include "StdAfx.h"
#include "ADOConn.h" ADOConn::ADOConn(void)
{
} ADOConn::~ADOConn(void)
{
} void ADOConn::OnInitADOConn(){
try{
//创建连接对象实例
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串
CString strConnect=_T("DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=;DBQ=shujuku.mdb;");
//使用 Open 方法连接数据库
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
} BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL){
try{
if(m_pConnection == NULL)
OnInitADOConn() ;
m_pConnection->Execute(bstrSQL , NULL , adCmdText) ;
return true ;
}
catch(_com_error e){
e.Description() ;
return false ;
}
} _RecordsetPtr & ADOConn::GetRecordSet(_bstr_t bstrSQL){
try{
if(m_pConnection == NULL)
OnInitADOConn() ;
m_pRecordset.CreateInstance(__uuidof(Recordset));
//打开记录集
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
}
catch(_com_error e){
e.Description() ;
}
return m_pRecordset ;
} void ADOConn::ExitConnect()
{
if(m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
}

  

智能指针 ADO数据库连接的更多相关文章

  1. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

  2. C++ 智能指针浅析

    C++ 智能指针浅析 为了解决 C++ 中内存管理这个老大难问题,C++ 11 中提供了三种可用的智能指针.(早期标准库中还存在一种 auto_ptr,但由于设计上的缺陷,已经被 unique_ptr ...

  3. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  6. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  7. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  8. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. ajax对象属性withCredentials

    默认情况下,ajax跨源请求不提供凭据(cookie.HTTP认证及客户端SSL证明等).通过将设置ajax的withCredentials属性设置为true,可以指定某个请求应该发送凭据.如果服务器 ...

  2. echarts实现条形图表

    导入相应的包需要的文件;

  3. Python学习路程day10

    Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. 事件驱动 简而言之,事件驱动分为二个部分:第一,注册事 ...

  4. Qt + FFmpeg 本地音频播放器

    http://pan.baidu.com/s/1hqoYXrI

  5. linux网卡驱动移植

    这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可 ...

  6. RSS(Residual Sum of Squares)的自由度为什么是n-1呢

    [转载请注明出处]http://www.cnblogs.com/mashiqi 在回归问题中,偶尔我们会遇到求方差的估计的情况.举了例子,我们常常通过Gaussian分布${\cal N}(\mu , ...

  7. Extjs控制面板组件

    (1)aoolyTo:(id) renderTo:(id)呈现在哪个html里面,同上  id最好用"" contentEI:() 呈现哪个html元素里面,把eI内的内容呈现 ( ...

  8. RelativeLayout.LayoutParams.addRule()方法

    1.应用场景 在使用RelativeLayout布局的时候,通常在载入布局之前在相关的XML文件中进行静态设置即可.但是,在有些情况下,我们需要动态的设置布局 的属性,在不同条件下设置不同的布局排列方 ...

  9. CC3000 主机驱动API介绍

    CC3000作为是一种简单集成,简单实用的无线宽带设备,她集成了完整的802.11协议栈,802.11个人安全请求:IP网络协议栈,CC3000主机驱动对CC3000硬件访问时很轻松的.CC3000逐 ...

  10. 建造者模式(Builder)

    建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的 ...