VC++下ADO数据库操作的封装类

本文介绍了一个在VC++环境下使用ADO(ActiveX Data Objects)进行数据库操作的封装类。类包含了初始化连接、执行SQL命令、获取记录集、关闭连接等功能。通过配置文件读取数据库连接信息,并提供了添加、删除、更新记录的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ADO 对象

对象
说明
Command
Command 对象定义了将对数据源执行的指定命令。
Connection
代表打开的、与数据源的连接。
DataControl (RDS)
将数据查询 Recordset 绑定到一个或多个控件上(例如,文本框、网格控件或组合框),以便在 Web 页上显示 ADOR.Recordset 数据。
datafactory (RDS Server)
实现对客户端应用程序的指定数据源进行读/写数据访问的方法。
DataSpace (RDS)
创建客户端代理以便自定义位于中间层业务对象
Error
包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。
Field
代表使用普通数据类型的数据的列。
Parameter
代表与基于参数化查询或存储过程的 Command 对象相关联的参数或自变量。
Property
代表由提供者定义的 ADO 对象的动态特性。
RecordSet
代表来自基本表或命令执行结果的记录的全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。

二、ADO 事件

事件
事件描述
事件数据
ConnectionClose
指示 ADO 要与 OLE DB 数据源断开连接。
无。
ConnectionOpen
指示 ADO 正在连接到 OLE DB 数据源。
如果客户端提供,则为连接到数据源所用的连接字符串。
Find
指示 ADO 客户端已调用 ADORecordset.Find 函数。
“查找”操作的判据;根据该判据匹配记录。
指示 ADO 客户端已调用 ADORecordset.GetRows 函数。
提取的行数。
QueryResult
指示数据库已返回响应查询的结果集。
无。
QuerySend
指示 ADO 正在执行命令。该事件可由下列函数触发:
Connection.Execute
Command.Execute
Connection.
<存储过程名>
Recordset.Open
构成查询的 SQL 语句。
RecordsetOpen
指示 ADO 正在打开远程服务器上的记录集。仅适用于三层方案。
打开记录集的源(通常为行返回的命令文本)。
Sort
指示 ADO 准备筛选或对数据排序。
排序或筛选应用于记录集数据的判据。
Transaction Rollback
指示 ADO 要中止当前本地事务。
返回真或假。如果为真,则保持中止,即该事务中止后紧跟着开始另一事务。如果为假,则不保持中止。
TransactionCommit
指示 ADO 正在提交 OLE DB 提供程序上的本地事务。
返回真或假。如果为真,则保留提交,即该事务提交后紧跟着开始另一事务。如果为假,则不保留提交。
TransactionStart
指示 ADO 正在开始 OLE DB 提供程序上的本地事务。
ADO 开始事务所基于的隔离级别。隔离级别指示可看到其他事务所做更改的哪一级别。
UpdateBatch
指示 ADO 正在向提供程序发送更新批处理。仅适用于三层方案。
如果有,为 ADO 将更新发送到的远程服务器名。

三、ADO 对象编程模型

连接数据源 (Connection),可选择开始事务。

可选择创建表示 SQL 命令的对象 (Command)。

可选择指定列、表以及 SQL 命令中的值作为变量参数 (Parameter)。
执行命令(Command、Connection 或 Recordset)。
如果命令以行返回,将行存储在存储对象中 (Recordset)。
可选择创建存储对象的视图以便进行排序、筛选和定位数据 (Recordset)。
编辑数据。可以添加、删除或更改行、列 (Recordset)。
在适当情况下,可以使用存储对象中的变更对数据源进行更新 (Recordset)。
在使用事务之后,可以接受或拒绝在事务中所做的更改。结束事务 (Connection)。 


四、ADO编程应用

ADOConn.h///

#pragma once


#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
rename("EOF", "adoEOF")rename("BOF" , "adoBOF")

#include<string>

class ADOConn
{
public:
ADOConn(void);
virtual ~ADOConn(void);

//添加一个指向Connection对象的指针
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针
_RecordsetPtr m_pRecordset;

//初始化--连接数据库
BOOL OnInitADOConn();

//执行查询
BOOL GetRecordSet(_bstr_t bstrSQL);

//执行SQL语句
BOOL ExecuteSQL(_bstr_t bstrSQL);

//断开数据库连接
void ExitConnect();
private:
CString ip;
CString username;
CString db_name;
CString userpwd;
public:
// 删除一条记录
bool DeleteRecord(_bstr_t bstrSQL);
// 增加一条记录
bool AddRecord(_bstr_t bstrSQL);
// 更新一条记录
bool UpdateRecord(_bstr_t bstrSQL);

};


/ADOConn.cpp//

#include "StdAfx.h"
#include "ADOConn.h"

#include<iostream>
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

ADOConn::ADOConn(void)
{
   m_pConnection = NULL;
   m_pRecordset = NULL;
   char path[MAX_PATH];
   GetModuleFileName(NULL, path, MAX_PATH);


   CString strPath = path;
   strPath = strPath.Left(strPath.ReverseFind('\\')); 
   strPath += "\\Config.ini";
   cout<<strPath;
   
   GetPrivateProfileString("DB Config","IP","127.0.0.1 ",ip.GetBuffer(MAX_PATH),MAX_PATH,strPath);
   GetPrivateProfileString("DB Config","User Name","sa",username.GetBuffer(MAX_PATH),MAX_PATH,strPath);
   GetPrivateProfileString("DB Config","User      PassWord","111111",userpwd.GetBuffer(MAX_PATH),MAX_PATH,strPath);
   GetPrivateProfileString("DB Config","DB Name","数据库名称",db_name.GetBuffer(MAX_PATH),MAX_PATH,strPath);

}

ADOConn::~ADOConn(void)
{
}

BOOL ADOConn::OnInitADOConn()
{
//初始化OLE/
//COM库环境
    ::CoInitialize(NULL);
//创建connection对象
try
{
m_pConnection.CreateInstance("ADODB.Connection");   
//设置连接字符串
CString strConn;
strConn.Format("Provider=SQLOLEDB.1;server=%s;Network Library=DBMSSOCN;Initial Catalog=%s; uid=%s;pwd=%s",ip,db_name,username,userpwd);
//cout<<strConn;
m_pConnection->Open((_bstr_t)strConn,"","",adModeUnknown);
return TRUE;
}
//捕捉异常
catch( _com_error &e )
{
//显示错误信息
AfxMessageBox(e.Description());
return FALSE;
}


}

BOOL ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
    try
{
//连接数据库,如果connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
if (!OnInitADOConn())
{
return FALSE;
}

//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
        m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
return TRUE;
}
    catch( _com_error &e )
{
AfxMessageBox(e.Description());
return FALSE;
}
//返回记录集
// return m_pRecordset;
}

BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
_variant_t RecordsAffected;
try
{
//是否已连接数据库
if(m_pConnection==NULL)
if (!OnInitADOConn())
{
return FALSE;
}
//connection对象的Execute方法(_bstr_t CommandText,
                //VARIANT * RecordsAffected,long Options)
//其中CommandText是命令字符串,通常是SQL命令
//参数RecordsAffected是操作完成后所影响的行数
//参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名
//adCmdProc-存储过程,adCmdUnknown-未知
        m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch( _com_error &e )
{
// AfxMessageBox("无法执行该操作,请核对操作");
AfxMessageBox(e.Description());
return FALSE;
}
}

void ADOConn::ExitConnect()
{
//关闭记录集和连接
    if(m_pRecordset != NULL)
{
m_pRecordset->Close();
m_pRecordset = NULL;
}
m_pConnection->Close();
m_pConnection = NULL;
//释放环境
::CoUninitialize();
}

bool ADOConn::DeleteRecord(_bstr_t bstrSQL)
{
ExecuteSQL(bstrSQL);
return false;
}

// 增加一条记录
bool ADOConn::AddRecord(_bstr_t bstrSQL)
{
ExecuteSQL(bstrSQL);
return false;
}

// 更新一条记录
bool ADOConn::UpdateRecord(_bstr_t bstrSQL)
{
ExecuteSQL(bstrSQL);
return false;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值