分享关于VC 使用ADO数据库使用的方法封装类

这篇博客介绍了一个使用VC++封装的ADO数据库操作类,用于连接和操作Access数据库。类包括打开/关闭数据库、添加/修改记录、查询、移动游标等功能,并提供了创建数据库和表的方法。

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

ADO是目前还较新的访问数据库的一种方法,该类型库提供了 使用各个类型版本数据库的公共接口,从文件访问数据,网络访问数据,等等操作数据集的一些方法,

接下来分享下关于操作access数据库的方法封装类 以此为例,其他数据库访问大同小异:


#import"C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#import"C:/Program Files/Common Files/System/ado/Msadox.dll"  rename_namespace("ADOCG") rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")  
using namespace ADOCG;
#define TESTHR(x) if FAILED(x) _com_issue_error(x);
#pragma warning (disable: 4146)
#pragma warning (default: 4146)
#include<stdio.h>
#include<iostream>
#include<fstream>
#include <string>
#include <vector>
using namespace std;


struct FIELDSINFO
{
FIELDSINFO(){
IsSetZero=true;//是否清零
IsSetPrimaryKey=false;//是否设为主键
}
string strFieldsName;//字段名
bool IsSetZero;//是否清零
bool IsSetPrimaryKey;//是否设为主键
};


class CKpAdoDatabase
{
public:
CKpAdoDatabase(void);
virtual ~CKpAdoDatabase(void);
public:
BOOL OpenMdb(LPSTR szMdbPath);//创建Connection接口 链接数据库
void OpenMdbTable(LPCSTR pszTableNmae);//打开数据库表 
void CloseTable();//关闭记录集表
void Close(); //关闭数据库连接
public:
void AddNew(LONG lnIndex=0,LPSTR Value="0");//添加记录
void SetValue(LONG lnIndex,LPCSTR Value);//修改记录
void Delete(_In_ int iIndex,_In_ int nCount = 1);
void FindData(LPCSTR pszTableNmae,LPCSTR pszWhereKey,LPCSTR pszValue,vector<LPCSTR>& vecName);//根据条件查询(SQL) 获取记录集
public:
ULONG GetrecordCount();//获取记录集的数量
ULONG GetFieldCount();//获取字段的数量
BOOL GetFieldInfo(long nIndex,string& strName);//获取字段的信息
BOOL GetFieldCollect(long nIndex,string& strName);//获取记录
void MoveNext();//游标向后
void MovePrevious();//游标向前
void MoveFirst();//头
void MoveLast();//尾
BOOL IsBOF();     //判断游标指针是否在记录头部
BOOL IsEOF();     //判断游标指针是否在记录尾部
void Update();//更新数据库
public:
BOOL IsHaveFile( LPSTR pszPath );
BOOL CreateMdb(string strMdbName);//创建ACCESS数据库 
BOOL CreateTable( string strMdbName,string strTabName,vector<FIELDSINFO*>& vecFields);//创建数据库表
BOOL IsTalbeExit(string strTable);//判断一个表在数据库中是否存在
public:
_ConnectionPtr m_pConnection;//定义ADO数据库连接指针
_RecordsetPtr m_pRecordset;//定义记录集指针
};



#include "KpAdoDatabase.h"
#include "shlwapi.h"
#include "KpString.h"


CKpAdoDatabase::CKpAdoDatabase(void)
{
::CoInitialize(NULL);//初始化数据库COM库
}


CKpAdoDatabase::~CKpAdoDatabase(void)
{
::CoUninitialize();
}
/************************************************
  函数名称:OpenMdb
  函数功能:连接数据库 (这里主要是ACCESS数据库……)
  输入参数:
szMdbPath  数据库路径
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase:: OpenMdb(LPSTR szMdbPath)
{
try{
HRESULT nRet=m_pConnection.CreateInstance(__uuidof(Connection));//创建Connection接口 实例化 m_pConnection指针
if(FAILED(nRet))return FALSE;
//构造ACCESS数据库连接字符串
char szConn[MAX_PATH]={0};
sprintf(szConn,"Provider=Microsoft.Jet.OLEDB.4.0;"//连接ACCESS数据库
"Data Source=%s;User ID=;Password=;",szMdbPath);
//构造Oracle链接字符串方式 如下
//sprintf(szConn,"Provider=OraOLEDB.Oracle.1;Password=tiger;User ID=scott;Data Source=%s;Persist Security Info=true","orcl");
//连接数据
m_pConnection->Open(_bstr_t(szConn),"","",adConnectUnspecified);
if(FAILED(nRet)){
return FALSE;
}
}catch(...){
return FALSE;
}
return TRUE;
}
/************************************************
  函数名称:OpenMdbTable
  函数功能:打开数据库表
  输入参数:
pszTableNmae  数据库表名称
  输出参数:
   void
*************************************************/
void CKpAdoDatabase:: OpenMdbTable(LPCSTR pszTableNmae)
{
    m_pRecordset.CreateInstance(__uuidof(Recordset));  //实例化 m_pRecordset指针
    string strSql="select * from ";                    //"select * from 数据库表名称";
strSql+=pszTableNmae;                              //数据库表名
m_pRecordset->Open(_bstr_t(strSql.c_str()),m_pConnection.GetInterfacePtr(), 
adOpenDynamic, adLockOptimistic, adCmdText);   //打开记录集
}
/************************************************
  函数名称:FindData
  函数功能:根据条件查询(SQL)
  输入参数:
pszTableNmae  数据库表名称
pszWhereKey   字段名(条件查询的条件字段)
pszValue      对应的记录值(条件字段值)
vecName       存储容器
sql查询语句如  "SELECT 字段 FROM 员工表 WHERE ID='5'"
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::FindData(LPCSTR pszTableNmae,LPCSTR pszWhereKey,LPCSTR pszValue,vector<LPCSTR>& vecName)
{
CloseTable();//关闭打开的表
    m_pRecordset.CreateInstance(__uuidof(Recordset));//实例化 
char szSql[MAX_PATH]={0};
sprintf(szSql,"SELECT * FROM %s WHERE %s='%s'",pszTableNmae,pszWhereKey,pszValue);
m_pRecordset->Open(_bstr_t(szSql),m_pConnection.GetInterfacePtr(), 
adOpenDynamic, adLockOptimistic, adCmdText);  //打开记录集
//获取字段
UINT nCount=m_pRecordset->Fields->GetCount();
m_pRecordset->MoveFirst();
while(TRUE){//获取记录集
string strTmp="";
for (long i=0;i<nCount;i++){//组合获取的整条记录
_bstr_t bstrName=m_pRecordset->Fields->GetItem(i)->GetValue();
if (strTmp.empty()){
strTmp+=(LPCSTR)bstrName;
}else{
strTmp+=",";
strTmp+=(LPCSTR)bstrName;
}
}
vecName.push_back(strTmp.c_str());
m_pRecordset->MoveNext();
if (IsEOF()){
break;
}
}
}
/************************************************
  函数名称:GetrecordCount
  函数功能:获取记录集的数量
  输入参数:
……
  输出参数:
   ULONG
*************************************************/
ULONG CKpAdoDatabase:: GetrecordCount()
{
//获取记录集的数量
ULONG nCount=0;
//nCount=m_pRecordset->GetRecordCount();// 获取记录有问题
return nCount;
}


/************************************************
  函数名称:GetFieldCount
  函数功能:获取字段的数量
  输入参数:
……
  输出参数:
   ULONG
*************************************************/
ULONG CKpAdoDatabase:: GetFieldCount()
{
//获取字段的数量
ULONG FCount=0;
FCount=m_pRecordset->Fields->GetCount();
return FCount;
}




/************************************************
  函数名称:GetFieldInfo
  函数功能:获取字段名称
  输入参数:
nIndex  字段Number
strName 得到的名称
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase:: GetFieldInfo(long nIndex,string& strName)
{
//获取字段的信息
_bstr_t bstrName=m_pRecordset->Fields->GetItem(nIndex)->GetName();
     strName=(LPCSTR)bstrName;
return TRUE;
}
/************************************************
  函数名称:GetFieldCollect
  函数功能:对应字段的记录值
  输入参数:
nIndex  字段Number
strName 得到的值
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase:: GetFieldCollect(long nIndex,string& strName)
{
    //获取记录
_bstr_t bstrName=m_pRecordset->Fields->GetItem(nIndex)->GetValue();
strName=(LPCSTR)bstrName;
return TRUE;
}


/************************************************
  函数名称:MoveNext
  函数功能:游标向下
  输入参数:
 
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::MoveNext()
{
m_pRecordset->MoveNext();
}
/************************************************
  函数名称:MovePrevious
  函数功能:游标向上
  输入参数:
 
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::MovePrevious()
{
m_pRecordset->MovePrevious();
}
/************************************************
  函数名称:MoveFirst
  函数功能:游标到头
  输入参数:
 
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::MoveFirst()
{
if (!IsBOF()){
m_pRecordset->MoveFirst();
}
}
/************************************************
  函数名称:MoveLast
  函数功能:游标到尾
  输入参数:
 
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::MoveLast()
{
if (!IsEOF()){
m_pRecordset->MoveLast();
}
}
/************************************************
  函数名称:IsEOF
  函数功能:判断游标指针是否在记录尾部
  输入参数:
 
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase::IsEOF()
{
//判断游标指针是否在记录尾部
if(m_pRecordset->adoEOF){
return TRUE;
}
return FALSE;
}
/************************************************
  函数名称:IsBOF
  函数功能:判断游标指针是否在记录头部
  输入参数:
 
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase:: IsBOF()
{
if(m_pRecordset->adoBOF){
return TRUE;
}
return FALSE;
}
/************************************************
  函数名称:AddNew
  函数功能:添加新纪录行
  输入参数:
lnIndex 字段Number(主键字段)
Value    设置的值
  输出参数:
   void
*************************************************/
void CKpAdoDatabase:: AddNew(LONG lnIndex,LPSTR Value)
{ //添加记录
m_pRecordset->AddNew();
m_pRecordset->Fields->GetItem(lnIndex)->Value=_bstr_t(Value);//设置主键字段值
LONG ulCount=GetFieldCount();//获取字段的数量
for(LONG i=1;i<ulCount;i++){//设置其他为0
m_pRecordset->Fields->GetItem(i)->Value=_bstr_t("0");
}
}
/************************************************
  函数名称:SetValue
  函数功能:设置字段对应的记录
  输入参数:
lnIndex 字段Number(主键字段)
Value    设置的值
  输出参数:
   void
*************************************************/
void CKpAdoDatabase::SetValue(LONG lnIndex,LPCSTR Value)
{ //修改记录
m_pRecordset->Fields->GetItem(lnIndex)->Value=_bstr_t(Value);
}
/************************************************
  函数名称:Delete
  函数功能:删除
  输入参数:


  输出参数:
   void
*************************************************/
void CKpAdoDatabase::Delete(_In_ int iIndex,_In_ int nCount/* = 1*/)
{
//m_pRecordset->Delete();
}
/************************************************
  函数名称:Update
  函数功能:更新保存记录
  输入参数:


  输出参数:
   void
*************************************************/
void CKpAdoDatabase:: Update()
{ //更新保存记录
m_pRecordset->Update(); 
}
/************************************************
  函数名称:CloseTable
  函数功能:关闭表
  输入参数:


  输出参数:
   void
*************************************************/
void CKpAdoDatabase:: CloseTable()
{ //关闭记录集表
//if(m_pRecordset->State){}
if (NULL!=m_pRecordset){
m_pRecordset->Close();
}
}
/************************************************
  函数名称:Close
  函数功能:关闭数据连接
  输入参数:


  输出参数:
   void
*************************************************/
void CKpAdoDatabase::Close()
{ //关闭数据库连接
if(m_pConnection!=NULL){
m_pConnection->Close();
m_pConnection.Release();
//::CoUninitialize();
}
}
/************************************************
  函数名称:IsHaveFile
  函数功能:查找文件是否存在
  输入参数:


  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase::IsHaveFile( LPSTR pszPath )
{
BOOL bFlag=FALSE;
WIN32_FIND_DATA find = { 0 };
HANDLE hFind = FindFirstFile( pszPath, &find );//开始查找
BOOL bRet = TRUE;
while( TRUE == bRet )
{
if( !(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ){
string strPathName=find.cFileName;
strPathName=strPathName.substr(strPathName.rfind(".")+1);
if(strPathName == "mdb"){
                bFlag=TRUE;
break;
}
}
bRet = FindNextFile( hFind, &find );
}
//关闭
FindClose( hFind );
return bFlag;
}


/************************************************
  函数名称:CreateMdb
  函数功能:创建ACCESS数据库和表
  输入参数:
strDBName 数据库路径名称
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase::CreateMdb(string strMdbName)

if (!IsHaveFile((LPSTR)strMdbName.c_str())){
string strMdbConn = "Provider='Microsoft.JET.OLEDB.4.0';Data source =" + strMdbName;
try{
 HRESULT hr = S_OK; 
 _CatalogPtr pCatalog = NULL;
 _bstr_t cnnstring(strMdbConn.c_str());
 TESTHR(hr = pCatalog.CreateInstance(__uuidof (Catalog)));
pCatalog->Create(cnnstring);
}catch(_com_error e){
 _bstr_t bstrDescription(e.Description());
 string strErro=string("创建ACCEESS数据库出错: ") + (LPSTR)e.Description()
 + string("Create ACCESS DB error: ") + (LPSTR)e.Description();
 wstring strTmp;
 CKpString::ByteToWChar(strErro.c_str(),strTmp);
 MessageBoxW(NULL,strTmp.c_str(),L"",MB_OK);
 return FALSE;
}
}
 return TRUE;
}


/************************************************
  函数名称:CreateTable
  函数功能:创建数据库表
  输入参数:
strMdbName 数据库路径
strTabName 表名
  输出参数:
   BOOL
*************************************************/
BOOL CKpAdoDatabase::CreateTable(string strMdbName,string strTabName,vector<FIELDSINFO*>& vecFields)
{
HRESULT hr = S_OK;
_CatalogPtr pCatalog = NULL;
_TablePtr pTableNew = NULL;
_IndexPtr pIndexNew = NULL;
_IndexPtr pIndex  = NULL;
_ColumnPtr pColumn  = NULL;
if(!IsHaveFile((LPSTR)strMdbName.c_str())){
MessageBoxW(NULL,L"数据库不存在,请先创建数据库!",L"提示",MB_OK);
return FALSE;
}
string strConn="Provider='Microsoft.JET.OLEDB.4.0';Data source = " + strMdbName+";User ID=;Password="; 
_bstr_t strcnn(strConn.c_str());
try{//实例化指针
TESTHR(hr = pCatalog.CreateInstance (__uuidof(Catalog)));
TESTHR(hr = pTableNew.CreateInstance(__uuidof(Table)));
TESTHR(hr = pIndexNew.CreateInstance(__uuidof(Index)));
TESTHR(hr = pIndex.CreateInstance   (__uuidof(Index)));
TESTHR(hr = pColumn.CreateInstance  (__uuidof(Column)));
pCatalog->PutActiveConnection(strcnn);// 连接
pTableNew->Name = _bstr_t(strTabName.c_str());// 表名
pTableNew->ParentCatalog = pCatalog;
// 加入字段
for(int i=0;i<vecFields.size();i++){
//(adVarWChar)为文本类型 (adLongVarWChar)为备注类型
pTableNew->Columns->Append(_variant_t(vecFields[i]->strFieldsName.c_str()), ADOCG::adLongVarWChar,255);
//将必填字段设置为false
pTableNew->Columns->GetItem(_variant_t(vecFields[i]->strFieldsName.c_str()))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =vecFields[i]->IsSetZero; 
if (vecFields[i]->IsSetPrimaryKey){// 加入主键
pIndexNew->Name = "pryIndex";//"日期";
pIndexNew->Columns->Append(_variant_t(vecFields[i]->strFieldsName.c_str()), ADOCG::adLongVarWChar, 255);
pIndexNew->PutPrimaryKey(1);//-1表示设置主键 1表示不设主键 如:pIndexNew->PutPrimaryKey(-1);
pIndexNew->PutUnique(1);//-1表示设置主键 1表示不设主键 如:pIndexNew->PutUnique(-1);
pTableNew->Indexes->Append(_variant_t ((IDispatch*)pIndexNew));
}
}
// 加入表中
pCatalog->Tables->Append(_variant_t ((IDispatch*)pTableNew));        
pCatalog->Tables->Refresh();
}catch(_com_error &e){
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
return FALSE;
}
return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值