// ADOConn.cpp: implementation of the ADOConn class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------
// 构造函数
//-------------------------------------------------------------------------------------------------
ADOConn::ADOConn()
{
m_bFlag=true; //默认为:true(连接/记录集返回成功)
}
//-------------------------------------------------------------------------------------------------
// 析构函数
//-------------------------------------------------------------------------------------------------
ADOConn::~ADOConn()
{
}
//-------------------------------------------------------------------------------------------------
// 初始化数据库连接
// 输入参数: v_iSelect(数据库选择) v_sDb0 v_sDb1 v_sDb2 v_sDb3
// 0: SQL数据库 数据库服务器地址/名称 数据库名称 用户名称 密码
// 1: ACCESS数据库 数据库名称 用户名称 密码
// 2: ODBC数据源 数据库源 用户名称 密码
// 输出结果: 连接数据库成功,获得Connection对象
//
// m_pConnection->Open(strConnect,"","",Options)中的Options可以是如下几个常量:
// adModeUnknown: 缺省。当前的许可权未设置
// adModeRead: 只读
// adModeWrite: 只写
// adModeReadWrite: 可以读写
// adModeShareDenyRead: 阻止其它Connection对象以读权限打开连接
// adModeShareDenyWrite: 阻止其它Connection对象以写权限打开连接
// adModeShareExclusive: 阻止其它Connection对象打开连接
// adModeShareDenyNone: 允许其它程序或对象以任何权限建立连接
//-------------------------------------------------------------------------------------------------
void ADOConn::OnInitADOConn(int v_iSelect, CString v_sDb0, CString v_sDb1, CString v_sDb2, CString v_sDb3)
{
_bstr_t strConnect;
::CoInitialize(NULL); //初始化COM库
try
{
m_pConnection.CreateInstance("ADODB.Connection"); //创建Connection对象
switch(v_iSelect) // 根据数据库类型,设置连接字符串,必须是BSTR型或者_bstr_t类型
{
case 0: // SQL 数据库
strConnect = "Provider=SQLOLEDB;Server="+v_sDb0+";Database="+v_sDb1+";uid="+v_sDb2+";pwd="+v_sDb3;
break;
case 1: // ACCESS 数据库
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+v_sDb1;
break;
case 2: // ODBC 访问方式
strConnect = "Data Source="+v_sDb0+";uid="+v_sDb2+";pwd="+v_sDb3;
break;
}
m_pConnection->Open(strConnect,"","",adModeUnknown); //连接数据库
}
catch (_com_error e)
{
AfxMessageBox(" 数据库连接失败:"+e.Description()+" "); //显示错误信息
m_bFlag = FALSE; //设置错误标志
}
}
//-------------------------------------------------------------------------------------------------
// 执行查询,返回记录集: 对应select语句
//
// m_pRecordset->Open(const _variant_t & Source, const _variant_t & ActiveConnection,CursorType,LockType,adCmdText)CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
// enum CursorTypeEnum
// {
// adOpenUnspecified = -1, ///不作特别指定
// adOpenForwardOnly = 0, ///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
// adOpenKeyset = 1, ///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
// adOpenDynamic = 2, ///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
// adOpenStatic = 3 ///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
// };
// LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
// enum LockTypeEnum
// {
// adLockUnspecified = -1, ///未指定
// adLockReadOnly = 1, ///只读记录集
// adLockPessimistic = 2, ///悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
// adLockOptimistic = 3, ///乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
// adLockBatchOptimistic = 4 ///乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
// };
//-------------------------------------------------------------------------------------------------
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象
m_pRecordset->CacheSize = 100; //数据缓冲量
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//取得表中的记录
}
catch(_com_error e)
{
AfxMessageBox(" 记录集连接失败:"+e.Description()+" "); //显示错误信息
m_bFlag = FALSE; //设置错误标志
}
return m_pRecordset;
}
//-------------------------------------------------------------------------------------------------
// 执行查询,返回记录集: 对应select语句(加锁)
//-------------------------------------------------------------------------------------------------
_RecordsetPtr& ADOConn::GetRecordSet_Lock(_bstr_t bstrSQL)
{
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset)); // 创建记录集对象
m_pRecordset->CacheSize=100; // 数据缓冲容量
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockPessimistic,adCmdText);
// 取得表中的记录
}
catch(_com_error e) // 捕捉异常
{
AfxMessageBox(" 记录集加锁失败:"+e.Description()+" "); // 显示错误信息
m_bFlag=false; // 记录集获取失败
}
return m_pRecordset; // 返回记录集
}
//-------------------------------------------------------------------------------------------------
// 执行SQL语句,对应Insert Update delete语句 _variant_t
//-------------------------------------------------------------------------------------------------
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 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(" 执行SQL语句失败:"+e.Description()+" "); // 显示错误信息
return false;
}
}
//-------------------------------------------------------------------------------------------------
// 关闭记录集和连接
//-------------------------------------------------------------------------------------------------
void ADOConn::ExitConnect()
{
if (m_pRecordset!=NULL)
{
if(m_pRecordset->State)
{
m_pRecordset->Close(); //关闭记录集
m_pRecordset.Release();
}
}
if (m_pConnection!=NULL)
{
m_pConnection->Close(); //关闭连接
m_pConnection.Release();
}
::CoUninitialize(); //释放库
}