Forrest Gump
===========================================================
Visual C++编程封装ADO类
===========================================================

http://www.4oa.com/Article/html/6/32/468/2005/16545.html

摘 要:本文介绍了ADO访问数据库的基本过程,给出了一种在Visual C++下封装ADO访问数据库类的方法。

关键词:封装;ADO;Visual C


 2.3 ADO封装类头文件

  封装类头文件ADODB.H定义如下:

class CADODB : public CObject
{
public:
CADODB(); //构造函数
~CADODB(); //析构函数
public:
int nResultRow; //查询结果行数
int nResultCol; //查询结果列数
CStringArray pData; //存放查询结果数组 大小为nRow*nCol
CString errormessage; //ADO错误信息
bool OpenDataBase(CString DsnName,CString sUserID,CString sPassword);
//打开数据库连接 输入DSN名称、用户ID和密码
int Select(CString Sql); //执行SQL查询语句,结果放在数组pData中
int Excute(CString Sql); //执行无返回值得SQL语句
bool CloseDataBase(); //关闭数据库连接
protected:
_ConnectionPtr m_pConnection; //定义连接指针
};

  2.4 封装类实现文件

  封装类实现文件ADODB.CPP如下:

#include "stdafx.h"
#include "ADODB.h"

CADODB::CADODB() //构造函数,完成初始化
{
nResultRow=0; //
nResultCol=0; //记录集行数和列数
m_pConnection = NULL;
}

CADODB::~CADODB() //关闭数据库物理连接
{
if(m_pConnection )m_pConnection->Close();
m_pConnection = NULL;
}

bool CADODB::OpenDataBase(CString DsnName,CString sUserID,CString sPassword)
{ //打开数据库连接

HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//创建连接对象
hr=m_pConnection->Open((_bstr_t)DsnName,(_bstr_t)sUserID,(_bstr_t)sPassword,adOpenUnspecified); //连接数据库

}

int CADODB::Select(CString SqlStr) //SQL查询语句函数
{ …
try
{
hr = m_pRecordset.CreateInstance("ADODB.Recordset");//创建纪录集对象实例
hr = m_pRecordset->putref_ActiveConnection(m_pConnection);//设置连接对象
hr=m_pRecordset->Open(vSqlString,vNull,adOpenDynamic,adLockOptimistic,adCmdText); //打开纪录集
nResultCol = m_pRecordset->Fields->GetCount();//获得纪录集总列数
while(!m_pRecordset->adoEOF)
{
for (j = 0; j < nResultCol; j++) //取一列数据
{
vValue = m_pRecordset->Fields->Item[(long)j]->Value;//取得当前记录字段数据
if(vValue.vt != 1) //数据非空
{
int type = vValue.vt;
if(VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK) //转换数据类型(为字符串)
str=vValue1.bstrVal; //保存结果值到临时变量str中
}
if(pData.GetSize()<i*nResultCol+j+1) //动态设置数组的大小
m_pResult.SetSize(i*nResultCol+j+1);
pData[i*nResultCol+j]=str; //保存结果到数组中
m_pRecordset->MoveNext(); //移动记录集指针到下一行
i++;
}
m_pRecordset->Close();
m_pRecordset=NULL;
nResultRow=i;
}
catch(_com_error e)///捕捉异常
{

}
pData->FreeExtra();//释放多余的内存空间
return nResultRow;
}

  3 使用ADO封装类

  建立了ADO封装类后,使用数据库操作就非常简单了。在需使用数据库查询的CPP文件中包含ADO封装类头文件"ADODB.H",然后定义一个CADODB类指针;接下来就是打开数据库连接。使用封装类的成员函数OpenDataBase(…),输入要连接的数据库的DSN名称、用户名和密码,就与数据库建立连接了。要注意的是如果同时连接多个数据库就要声明多个CADODB对象指针,保证数据库连接对象是全局且惟一。接下来就是,调用成员函数Select取得数据库查询结果,执行完毕后查询结果放在CADODB的成员字符数组指针pData中,数组大小可以从成员变量nResultRow和nResultCol中得出。基本步骤如下:

  在"stdafx.h"中加入ADO库的导入语句

#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF")

  在应用程序类中初始化COM对象,在InitInstance()中加入以下语句

AfxOleInit();

  加入封装类的声明文件

#include "ADODB.H"


  定义封装类对象

CADODB ADO1; //连接数据库1
CADODB ADO2; //连接数据库2

ADO1.OpenDataBase("数据源名称","用户ID","用户密码") //建立连接,第一次连接时调用
ADO1.Select("select * from 表名"); //执行SQL查询语句
int nRow= ADO1.GetResultRow(); //取得记录行数
int nCol= ADO1.GetResultCol(); //取得记录列数
for(i=0;i<nRow;i++) //取得查询结果
for(j=0;j<nCol;j++)
printf("第%d行第%d列的值是%sn",i,j,ADO1.pData[i*nCol+j];

ADO1.CloseDataBase(); //使用完后关闭数据库连接
fesir 发表于:2006.08.08 14:01 ::分类: ( C/C++ ) ::阅读:(272次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...