// -- 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 ;
}
}