// -- CAdoDB.h
// -- 导入ADO接口
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename( "BOF", "adoBOF" ) rename( "EOF", "adoEOF" ) rename( "LockTypeEnum", "NewLockTypeEnum" ) rename( "DataTypeEnum", "NewDataTypeEnum" ) rename( "FieldAttributeEnum", "NewFieldAttributeEnum" ) rename( "EditModeEnum", "NewEditModeEnum" ) rename( "RecordStatusEnum", "NewRecordStatusEnum" ) rename( "ParameterDirectionEnum", "NewParameterDirectionEnum" )
class CAdoDB
{
public:
_ConnectionPtr m_pConnection ; // 数据库连接对象的指针
_RecordsetPtr m_pRecordset ; // 数据库记录集对象的指针
CString m_DBName ; // 记录数据库名
CString m_strUserID ; // 记录连接SQL Server时所使用的用户名
CString m_strUserPassword ; // 记录连接SQL Server时所使用的密码
CString m_strDataSource ; // 记录数据源地址
public:
CAdoDB( CString DBName,
CString strUserID = _T( "" ),
CString strPassword = _T( "" ),
CString strDataSource = _T( "" ) ) ; // AdoDB类构造函数
virtual ~CAdoDB() ; // AdoDB类析构函数
BOOL OnInitDBConnection() ; // 初始化数据库连接
void ExitConnect() ; // 断开与数据库的连接
BOOL IsConnected() ; // 数据库连接是否有效
_RecordsetPtr& GetRecordSet( _bstr_t vSQL ) ; // 执行SELECT返回记录集
BOOL ExecuteSQL( _bstr_t vSQL ) ; // 执行SQL语句 INSERT UPDATE DELETE 等
};
// -- CAdoDB.cpp
#include "stdafx.h"
#include "CAdoDB.h"
CAdoDB::CAdoDB( CString DBName, CString strUserID, CString strUserPassword, CString strDataSource )
{
// -- CAdoDB类构造函数
TRACE( "Construction Of Class CAdoDB/n" ) ;
// 成员变量初始化
m_pConnection = NULL ;
m_pRecordset = NULL ;
m_DBName = DBName ;
m_strUserID = strUserID ;
m_strUserPassword = strUserPassword ;
m_strDataSource = strDataSource ;
// 连接数据库
OnInitDBConnection() ;
}
CAdoDB::~CAdoDB()
{
// -- CAdoDB类析构函数
TRACE( "Destruction Of Class CAdoDB/n" ) ;
// CAdoDB对象无效时断开与数据库的链接
ExitConnect() ;
}
BOOL CAdoDB::OnInitDBConnection()
{
// -- 初始化数据库连接
TRACE( "OnInitDBConnection Of Class CAdoDB/n" ) ;
try
{
// 初始化OLE/COM库环境
::CoInitialize( NULL ) ;
// 创建数据库连接对象
m_pConnection.CreateInstance( _T( "AdoDB.Connection") ) ;
// 创建连接字符串
_bstr_t strConnection = _T( "Provider = SQLOLEDB.1 ; Persist Security Info = True ; Data Source =" ) ;
if ( m_strDataSource.IsEmpty() )
{
strConnection += _T( "(local)" ) ;
}
else
{
strConnection += _bstr_t( m_strDataSource ) ;
}
strConnection += _T( "; Initial Catalog =" ) ;
strConnection += _bstr_t( m_DBName ) ;
strConnection += _T( "; User ID =" ) ;
strConnection += _bstr_t( m_strUserID ) ;
strConnection += _T( "; Password =" ) ;
strConnection += _bstr_t( m_strUserPassword ) ;
strConnection += _T( ";" ) ;
// 如果不使用用户名和密码连接则进行Windows验证连接
if ( m_strUserID.IsEmpty() )
{
strConnection += _T( " Integrated Security = SSPI ;" ) ;
}
TRACE( "/n%s/n", (LPCTSTR)strConnection ) ;
// 设置超时为5秒
m_pConnection->CommandTimeout = 5 ;
// 建立连接
m_pConnection->Open( strConnection, _T( "" ), _T( "" ), adModeUnknown ) ;
// 初始化成功
TRACE( "初始化数据库连接成功/n" ) ;
return TRUE ;
}
catch ( _com_error e )
{
TRACE( "Exceptions In OnInitDBConnection Of Class CAdoDB/n" ) ;
TRACE( "%s/n", (LPCTSTR)e.Description() ) ;
m_pConnection = NULL ;
TRACE( "初始化数据库连接失败/n" ) ;
return FALSE ;
}
catch ( ... )
{
TRACE( "未知的异常出现在类 CAdoDB 成员函数 OnInitDBConnection 中/n" ) ;
m_pConnection = NULL ;
TRACE( "初始化数据库连接失败/n" ) ;
return FALSE ;
}
}
void CAdoDB::ExitConnect()
{
// -- 断开与数据库的连接
TRACE( "ExitConnect Of Class CAdoDB/n" ) ;
// 断开记录集连接
if ( m_pRecordset != NULL )
{
m_pRecordset->Close() ;
}
// 断开数据库连接
if ( m_pConnection != NULL )
{
m_pConnection->Close() ;
}
// 释放环境资源
::CoUninitialize() ;
}
BOOL CAdoDB::IsConnected()
{
// -- 数据库连接是否有效
if ( m_pConnection != NULL )
{
return TRUE ;
}
return FALSE ;
}
_RecordsetPtr& CAdoDB::GetRecordSet( _bstr_t vSQL )
{
// -- 执行SELECT返回记录集
TRACE( "GetRecordSet Of Class CAdoDB/n" ) ;
try
{
// 断开先前的记录集连接
if ( m_pRecordset != NULL )
{
m_pRecordset->Close() ;
}
// 如果还未连接数据库则先连接数据库
if ( m_pConnection == NULL )
{
if ( !OnInitDBConnection() )
{
TRACE( "当前与SQL Server的连接无效无法执行SQL语句/n" ) ;
m_pRecordset = NULL ;
return m_pRecordset ;
}
}
TRACE( "/nSQL 语句 : %s/n/n", (LPCTSTR)vSQL ) ;
// 创建记录集
m_pRecordset.CreateInstance( __uuidof( Recordset ) ) ;
// 取得表中的记录集
m_pRecordset->Open( vSQL,
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText ) ;
}
catch ( _com_error e )
{
TRACE( "Exceptions In GetRecordSet Of Class CAdoDB/n" ) ;
TRACE( "%s/n", (LPCTSTR)e.Description() ) ;
m_pRecordset = NULL ;
return m_pRecordset ;
}
catch ( ... )
{
TRACE( "未知的异常出现在类 CAdoDB 成员函数 GetRecordSet 中/n" ) ;
m_pRecordset = NULL ;
return m_pRecordset ;
}
return m_pRecordset ;
}
BOOL CAdoDB::ExecuteSQL( _bstr_t vSQL )
{
// -- 执行SQL语句 INSERT UPDATE DELETE 等
TRACE( "ExecuteSQL Of Class CAdoDB/n" ) ;
try
{
// 如果还未连接数据库则先连接数据库
if( m_pConnection == NULL )
{
if ( !OnInitDBConnection() )
{
TRACE( "当前与SQL Server的连接无效无法执行SQL语句/n" ) ;
return FALSE ;
}
}
TRACE( "/nSQL 语句 : %s/n/n", (LPCTSTR)vSQL ) ;
// 执行SQL语句
m_pConnection->Execute( vSQL, NULL, adCmdText ) ;
// 执行成功
return TRUE ;
}
catch ( _com_error e )
{
TRACE( "Exceptions In ExecuteSQL Of Class CAdoDB/n" ) ;
TRACE( "%s/n", (LPCTSTR)e.Description() ) ;
// 执行失败
return FALSE ;
}
catch ( ... )
{
TRACE( "未知的异常出现在类 CAdoDB 成员函数 ExecuteSQL 中/n" ) ;
return FALSE ;
}
}