//////////////////////////////////////////////////////////////////////
// 构造函数
/**///////////////////////////////////////////////////////////////////////
//默认的构造函数
#include "stdafx.h"
#include "ADODB.h"
#include <iostream>
#include <fstream>
using namespace std;
ADOLib::ADOLib()
{
//初始化
m_nResultRow = 0;
m_nResultCol=0;
m_pConnection = NULL;
//创建对象
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pCommand.CreateInstance(_uuidof(Command));
}
//传入参数的构造函数
ADOLib::ADOLib(_ConnectionPtr pConnection)
{
m_pConnection = pConnection;
m_nResultRow = 0;
m_nResultCol=0;
//创建对象
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pCommand.CreateInstance(_uuidof(Command));
}
/**///////////////////////////////////////////////////////////////////////
// 析构函数
/**///////////////////////////////////////////////////////////////////////
ADOLib::~ADOLib()
{
if (m_pRecordset)
{
if(m_pRecordset->State!=adStateClosed)
{
m_pRecordset->Close();
}
m_pRecordset = NULL;
}
if (m_pCommand)
{
if(m_pCommand->State!=adStateClosed)
{
m_pCommand->Release();
}
m_pCommand = NULL;
}
if (m_pConnection)
{
if(m_pConnection->State!=adStateClosed)
{
m_pConnection->Close();
}
m_pConnection = NULL;
}
}
/**//////////////////////////////////////////////////////////////////////
///简单操作函数
////////////////////////////////////////////////////////////////////
//得到操作结果的行数
long ADOLib::GetResultRow()
{
return this->m_nResultRow;
}
//得到操作结果的列数
long ADOLib::GetResultCol()
{
return this->m_nResultCol;
}
//得到操作结果
_RecordsetPtr ADOLib::GetResult()
{
return this->m_pRecordset;
}
/**////////////////////////////////////////////////////////////////////////
///连接操作
///////////////////////////////////////////////////////////////////////
//连接到数据库
//1.连接字符串可以自己构造,也可以从文件中读出
BOOL ADOLib::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
{
try{
m_pConnection.CreateInstance(__uuidof(Connection));
HRESULT hr;
//如果用文件方式配置数据源,进行配置
if(strFileName.Compare("")!=0)
{
CString con = "File Name="+strFileName;
m_pConnection->ConnectionString =(_bstr_t)con;
hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions);
}
else
{
//自己配置连接字符串
m_pConnection->ConnectionString = (_bstr_t)strConStr;
hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions);
}
//进行连接
//连接失败
if(FAILED(hr))
{
AfxMessageBox("连接失败!");
return FALSE;
}
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"B");
return FALSE;
}
return TRUE;
}
//断开连接
void ADOLib::DisConnect()
{
if (m_pConnection)
{
if(m_pConnection->State!=adStateClosed)
m_pConnection->Close();
}
}
/**////////////////////////////////////////////////////////////////////////
///更新操作
///////////////////////////////////////////////////////////////////////
BOOL ADOLib::Execute(CString strSql)
{
try
{
_variant_t vNULL;
vNULL.vt = VT_ERROR;
/**////定义为无参数
vNULL.scode = DISP_E_PARAMNOTFOUND;
/**////非常关键的一句,将建立的连接赋值给它
m_pCommand->ActiveConnection = m_pConnection;
/**////命令字串
m_pCommand->CommandText = (_bstr_t)strSql;
/**////执行命令,取得记录集
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
//确实,vNULL中的intVal是执行操作所影响的行数
m_nResultRow = 0;
m_nResultRow = vNULL.intVal;
}
catch(_com_error &e)
{
m_nResultRow = 0;
return FALSE;
}
return TRUE;
}
/**////////////////////////////////////////////////////////////////////////
///查询操作
///////////////////////////////////////////////////////////////////////
BOOL ADOLib::Select(CString strSql)
{
try
{
m_nResultCol=0;
m_nResultRow=0;
m_pRecordset->CursorLocation=adUseClient; //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
m_nResultRow = m_pRecordset->GetRecordCount(); //得到查询结果的行数
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"D");
return FALSE;
}
return TRUE;
}
//查询语句,负责对仅仅查询一个字段的情况进行处理
//结果存放在CStringArray类型的变量pResult中
BOOL ADOLib::Select(CString strSql,CStringArray& Result)
{
if(Select(strSql)!=0)
{
Result.RemoveAll();
for(int i=0;i<m_nResultRow;i++)
{
_variant_t value;
value=m_pRecordset->Fields->Item[(long)0]->Value;
if(value.vt==3||value.vt==14)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
Result.Add(strTrans);
}
else
{
CString strTrans(value.bstrVal);
Result.Add(strTrans);//
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
return TRUE;
}
else
{
m_pRecordset->Close();
return FALSE;
}
}
BOOL ADOLib::SelectMulitCol(CString strSql,CStringArray& Result)
{
if(Select(strSql)!=0)
{
Result.RemoveAll();
_variant_t value;
for(int i=0;i<m_nResultRow;i++)
{
for(int j=0;j<m_nResultCol;j++)
{
value=m_pRecordset->Fields->Item[(long)(/**//*i*m_nResultCol+*/j)]->Value;
if(value.vt==3)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
Result.Add(strTrans);
}
if(value.vt==14)
{
CString strTrans;
strTrans.Format("%ld",value.ullVal);
Result.Add(strTrans);
}
else
if(value.vt==7)
{
COleDateTime time = value.date;
CString strTemp;
strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
Result.Add(strTemp);
}
else
{
CString str;
str=value.bstrVal;
Result.Add(str);//
}
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
return TRUE;
}
else
{
m_pRecordset->Close();
return FALSE;
}
}
//保存查询结果到文件
BOOL ADOLib::SelectToFile(CString strSql,CString filename)
{
ofstream sfile(filename,ios::app);
CString aa;
//sfile.open(filename,ios::app);
if(sfile.is_open()==false)
{
//MessageBox("打开文件失败");
return FALSE;
}
if(Select(strSql)!=0)
{
//Result.RemoveAll();
_variant_t value;
for(int i=0;i<m_nResultRow;i++)
{
for(int j=0;j<m_nResultCol-1;j++)
{
value=m_pRecordset->Fields->Item[(long)(/**//*i*m_nResultCol+*/j)]->Value;
if(value.vt==3)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
//Result.Add(strTrans);
sfile<<value.intVal<<",";
}
if(value.vt==14)
sfile<<value.ullVal<<","
com组件的数据库连接文件


在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,由微软开发,用于简化Windows应用程序的编写。它提供了一套面向对象的API,使得开发者能够利用Windows API的功能,而无需直接与底层接口打交道。MFC特别适用于创建桌面应用程序,其中涉及到数据库交互是常见需求之一。"com组件的数据库连接文件"指的是使用MFC与ACCESS数据库进行通信的组件或类库。 ACCESS数据库是微软的一款关系型数据库管理系统,常用于小型到中型企业级的数据存储和管理。它基于JET引擎,支持SQL语法,并且与Microsoft Office套件兼容,方便数据导入导出。 在MFC中,对ACCESS数据库的操作通常通过ODBC(Open Database Connectivity)或DAO(Data Access Objects)实现。ODBC是一个标准的数据库访问接口,允许应用程序通过驱动程序与多种数据库系统交互,而DAO则是微软早期提供的数据库访问技术,专门针对Microsoft Jet数据库引擎,如ACCESS。 在描述中提到的"封装类",意味着有开发者或团队为了简化MFC与ACCESS数据库的交互,编写了一个类库,将常见的数据库操作如打开、关闭、查询、插入、更新、删除等函数封装在一起。这样做的好处是提高了代码的可重用性和可维护性,减少了开发者的工作量。 这个adolib可能就是这样一个封装库,它可能包含了如下的类和方法: 1. 数据库连接类:用于建立和断开与ACCESS数据库的连接,可能有一个成员函数`Open(const char* dbPath)`用于指定数据库路径并打开连接,以及`Close()`函数用于关闭连接。 2. 查询执行类:提供了执行SQL语句的功能,可能有`ExecuteNonQuery(const char* sql)`用于执行非查询操作(如INSERT、UPDATE、DELETE),以及`ExecuteQuery(const char* sql, Recordset& rs)`用于执行查询操作并将结果集返回给Recordset对象。 3. 记录集类:代表了数据库中的数据行集合,可以遍历、修改记录,并提供了绑定到MFC控件的能力。 4. 错误处理:封装了错误检查和报告,确保在出现异常时能够提供有用的反馈。 5. 其他辅助函数:如事务管理、预编译语句、参数化查询等,以提高性能和安全性。 在实际应用中,使用这样的封装库可以极大地简化代码,使得数据库操作更加直观和高效。开发者只需要关注业务逻辑,而无需过多关心数据库操作的细节。例如,创建一个新的记录可以通过创建一个记录集对象,然后调用其`AddNew()`和`Update()`方法;查询数据则可以通过构建SQL语句,用执行查询类的相应方法获取结果集,再遍历记录集进行处理。 "com组件的数据库连接文件"是MFC环境下与ACCESS数据库交互的一个工具,通过封装常见的数据库操作,为开发者提供了便利,降低了开发复杂性。在实际项目中,这样的库可以显著提高开发效率,同时保持代码的整洁和规范。


































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 6951
- 资源: 34
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- DEVC++安装包.rar
- 自动驾驶多工况避障模型研究:联仿技术与预设障碍物的智能规避策略,自动驾驶不同工况下的避障模型研究:利用Perscan、Simulink与Carsim联仿技术的障碍避免能力,自动驾驶不同工况避障模型(p
- 数据中台与业务中台设计方案
- Modbus RTU 51单片机从机组态通信源码:支持485与232串口通信,通用功能码实现高效数据传输,Modbus RTU 51单片机从机源码支持多种串口通信与常用功能码实现详解,Modbus R
- Java读写FM1208CPU卡源码
- 两阶段鲁棒优化程序:微网成本效益综合评估与发电设备配置优化系统,微网模型下的两阶段鲁棒优化程序:考虑安装成本、运营成本及综合效益,实现发电设备与风光储的容量优化配置,两阶段鲁棒优化程序 采用微网为模型
- Linux系统入门到精通:从基础命令到服务管理和日志解析
- modbusTCP通讯样例程序
- 服务器安装windows8.1orwindows2012r2时候找不到磁盘时的raid卡驱动
- "情感领域 文档 7.docx:表达爱情结束时的心境与释怀,描述感情的淡去和遗忘 18字"
- 高质量OPC客户端DA客户端源码解析(C#开发,适用于VS多种版本,行业广泛应用,二次开发简易,含详细注释及测试视频),高质量OPC客户端DA客户端源码解析(C#开发,VS编辑器兼容,适用于多行业应用
- win32汇编环境,窗口程序中使编辑框控件子类化的示例一
- 基于PyTorch的UNet网络集成ASPP模块实现语义分割
- jijixiejia jijava
- Java读写ICode2 15693标签源码
- Docker教程PPT


