封裝ADO編程Connection對(duì)象的類(lèi)
// ADOConnection.cpp: implementation of the CADOConnection class.
//
/**///////////////////////////////////////////////////////////////////////
/**//******************************************************************************
[文件名]: ADOConnection.cpp(ADO連接對(duì)象_ConnectionPtr封裝類(lèi))
[版本號(hào)]: Ver1.0(2008-06-09)
[作 者]: isabc (E-mail:isabc@163.com QQ:272126451)
-------------------------------------------------------------------------------
連接:通過(guò)"連接"可從應(yīng)用程序訪問(wèn)數(shù)據(jù)源,連接是交換數(shù)據(jù)所必需的環(huán)境。
-------------------------------------------------------------------------------
注意事項(xiàng):
1. 必須在下面指明 msado15.dll 的全路徑, 一般在 "C:\Program Files\
Common Files\System\ADO\" 目錄下.
2. 在使用本類(lèi)之前必須要初始化 COM 環(huán)境, 可以調(diào)用 CoInitialize(NULL)
來(lái)初始化, 用 CoUninitialize() 釋放;
3. 在使用記錄集對(duì)象前必須先調(diào)用 CAdoConnection::Open() 連接數(shù)據(jù)庫(kù),
連接后可給多個(gè) CAdoRecordSet 對(duì)象使用, 用完后須關(guān)閉數(shù)據(jù)庫(kù).
4. 使用記錄集執(zhí)行SQL語(yǔ)句之前, 要使用構(gòu)建方法或調(diào)用 SetAdoConnection()
關(guān)聯(lián)到連接對(duì)象.
******************************************************************************/
#include "stdafx.h"
#include "ADODataBase.h"
#include "ADOConnection.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////
CADOConnection::CADOConnection()

{
//-----------------------創(chuàng)建 Connection 對(duì)象-----------------------------
m_pConnection.CreateInstance("ADODB.Connection");
#ifdef _DEBUG
if (m_pConnection == NULL)
{
AfxMessageBox("Connection 對(duì)象創(chuàng)建失敗! 請(qǐng)確認(rèn)是否初始化了COM環(huán)境\r\n");
}
#endif
ASSERT(m_pConnection != NULL);
}
CADOConnection::~CADOConnection()

{
if (m_pConnection != NULL)
{
Release();
}
}

/**//*=============================================================================
Name: 連接到數(shù)據(jù)源.
-------------------------------------------------------------------------------
Params: [lpszConnect]: 連接字符串, 包含連接信息.
[lOptions]: 可選. 決定該方法是以同步還是異步的方式連接數(shù)據(jù)源.
可以是如下某個(gè)常量:
---------------------|---------------------------------------------------------
[常量] |[說(shuō)明]
---------------------|---------------------------------------------------------
adConnectUnspecified |(默認(rèn))同步方式打開(kāi)連接.
adAsyncConnect |異步方式打開(kāi)連接. Ado用 ConnectComplete 事件來(lái)通知已經(jīng)完成連接.
-------------------------------------------------------------------------------
Remark: 調(diào)用連接對(duì)象的成員函數(shù)Open()
=============================================================================*/
BOOL CADOConnection::Open(LPCTSTR lpszConnect, long lOptions)

{
ASSERT(m_pConnection != NULL);
ASSERT(AfxIsValidString(lpszConnect));
if (strcmp(lpszConnect, _T("")) != 0)
{
m_strConnect = lpszConnect;
}
if (m_strConnect.IsEmpty())
{
ASSERT(FALSE);
return FALSE;
}
if (IsOpen())
Close();
try
{
// 連接數(shù)據(jù)庫(kù) ---------------------------------------------
return (m_pConnection->Open(_bstr_t(LPCTSTR(m_strConnect)), "", "", lOptions) == S_OK);
}
catch (_com_error e)
{
TRACE(_T("Warning: 連接數(shù)據(jù)庫(kù)發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
TRACE(_T("%s\r\n"), GetLastErrorText());
return FALSE;
}
catch (
)
{
TRACE(_T("Warning: 連接數(shù)據(jù)庫(kù)時(shí)發(fā)生未知錯(cuò)誤:"));
}
return FALSE;
}

/**//*=============================================================================
Name: 連接 SQL SERVER 數(shù)據(jù)庫(kù).
-------------------------------------------------------------------------------
Params: [dbsrc]: SQL SERVER 服務(wù)器名.
[dbname]: 默認(rèn)的數(shù)據(jù)庫(kù)名.
[user]: 用戶名.
[pass]: 密碼.
------------------------------------------------------------------------------
調(diào)用本類(lèi)成員函數(shù)Open()
=============================================================================*/
BOOL CADOConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, long lOptions)

{
CString strConnect = _T("Provider=SQLOLEDB.1; Data Source=") + dbsrc +
_T("; Initial Catalog=") + dbname +
_T("; User ID=") + user +
_T("; PWD=") + pass;
return Open(LPCTSTR(strConnect), lOptions);
}

/**//*=============================================================================
Name: 連接 ACCESS 數(shù)據(jù)庫(kù).
-------------------------------------------------------------------------------
Params: [dbpath]: MDB 數(shù)據(jù)庫(kù)文件路徑名.
[pass]: 訪問(wèn)密碼.
------------------------------------------------------------------------------
調(diào)用本類(lèi)成員函數(shù)Open()
=============================================================================*/
BOOL CADOConnection::ConnectAccess(CString dbpath, CString pass, long lOptions)

{
CString strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=") + dbpath;
if (pass != _T("")) 
{
strConnect += _T("Jet OLEDB:Database Password=") + pass + _T(";");
}
return Open(LPCTSTR(strConnect), lOptions);
}

/**//*=============================================================================
Name: 通過(guò) udl 文件連接數(shù)據(jù)庫(kù).
-------------------------------------------------------------------------------
Params: [strFileName]: UDL 數(shù)據(jù)庫(kù)連接文件路徑名.
------------------------------------------------------------------------------
調(diào)用本類(lèi)成員函數(shù)Open()
=============================================================================*/
BOOL CADOConnection::OpenUDLFile(LPCTSTR strFileName, long lOptions)

{
CString strConnect = _T("File Name=");
strConnect += strFileName;
return Open(LPCTSTR(strConnect), lOptions);
}


/**//*=============================================================================
Name: 關(guān)閉與數(shù)據(jù)源的連接.
-------------------------------------------------------------------------------
Remarks: 使用 Close 方法可關(guān)閉 Connection 對(duì)象以便釋放所有關(guān)聯(lián)的系統(tǒng)資源. 調(diào)用
連接對(duì)象成員函數(shù)Close()
=============================================================================*/
void CADOConnection::Close()

{
try
{
if (m_pConnection != NULL && IsOpen()) 
{
m_pConnection->Close();//關(guān)閉連接
}
}
catch (_com_error e)
{
TRACE(_T("Warning: 關(guān)閉數(shù)據(jù)庫(kù)發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
}

/**//*=============================================================================
Name: 關(guān)閉連接并釋放對(duì)象.
-------------------------------------------------------------------------------
Remarks: 關(guān)閉連接并釋放connection對(duì)象.
=============================================================================*/
void CADOConnection::Release()

{
if (IsOpen())
Close();
m_pConnection->Release();//釋放連接對(duì)象
}

/**//*=============================================================================
Name: 執(zhí)行指定的查詢、SQL 語(yǔ)句、存儲(chǔ)過(guò)程等.
----------------------------------------------------------
Remarks: 請(qǐng)參考 CAdoRecordSet 類(lèi)的Open方法. 返回的 Recordset 對(duì)象始
終為只讀、僅向前的游標(biāo).
=============================================================================*/
_RecordsetPtr CADOConnection::Execute(LPCTSTR lpszSQL, long lOptions)

{
ASSERT(m_pConnection != NULL);
ASSERT(AfxIsValidString(lpszSQL));
try
{
return m_pConnection->Execute(_bstr_t(lpszSQL), NULL, lOptions);
}
catch (_com_error e)
{
TRACE(_T("Warning: Execute 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"),
e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}

/**//*=============================================================================
Name: 取消操作
-------------------------------------------------------------------------------
Remarks: 請(qǐng)參考 CAdoRecordSet 類(lèi) Cancel 方法.
=============================================================================*/
BOOL CADOConnection::Cancel()

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->Cancel();
}
catch (_com_error e)
{
TRACE(_T("Warning: Cancel 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"),
e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}

/**//*=============================================================================
Name: 取得最后發(fā)生的錯(cuò)誤信息.
=============================================================================*/
CString CADOConnection::GetLastErrorText()

{
ASSERT(m_pConnection != NULL);
CString strErrors = "";
try
{
if (m_pConnection != NULL)
{
ErrorsPtr pErrors = m_pConnection->Errors;
CString strError;
for (long n = 0; n < pErrors->Count; n++)
{
ErrorPtr pError = pErrors->GetItem(n);
strError.Format(_T("Description: %s\r\nState: %s, Native: %d, Source: %s\r\n"),
(LPCTSTR)pError->Description,
(LPCTSTR)pError->SQLState,
pError->NativeError,
(LPCTSTR)pError->Source);
strErrors += strError;
}
}
return strErrors;
}
catch (_com_error e)
{
TRACE(_T("Warning: GetLastError 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return strErrors;
}
return strErrors;
}
ErrorsPtr CADOConnection::GetErrors()

{
ASSERT(m_pConnection != NULL);
try
{
if (m_pConnection != NULL)
{
return m_pConnection->Errors;
}
return NULL;
}
catch (_com_error e)
{
TRACE(_T("Warning: GetErrors 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
return NULL;
}
ErrorPtr CADOConnection::GetError(long index)

{
ASSERT(m_pConnection != NULL);
try
{
if (m_pConnection != NULL)
{
ErrorsPtr pErrors = m_pConnection->Errors;
if (index >= 0 && index < pErrors->Count)
{
return pErrors->GetItem(_variant_t(index));
}
}
return NULL;
}
catch (_com_error e)
{
TRACE(_T("Warning: GetError 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
return NULL;
}

/**//*========================================================================
Name: 取得默認(rèn)數(shù)據(jù)庫(kù)的名稱.
==========================================================================*/
CString CADOConnection::GetDefaultDatabase()

{
ASSERT(m_pConnection != NULL);
try
{
return CString(LPCTSTR(_bstr_t(m_pConnection->GetDefaultDatabase())));//默認(rèn)數(shù)據(jù)庫(kù)名
}
catch (_com_error e)
{
TRACE(_T("Warning: GetDefaultDatabase 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return CString(_T(""));
}
}

/**//*=============================================================================
Name: 取得 Connection 對(duì)象提供者的名稱.
=============================================================================*/
CString CADOConnection::GetProviderName()

{
ASSERT(m_pConnection != NULL);
try
{
return CString(LPCTSTR(_bstr_t(m_pConnection->GetProvider())));//連接對(duì)象提供者
}
catch (_com_error e)
{
TRACE(_T("Warning: GetProviderName 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return CString(_T(""));
}
}

/**//*=============================================================================
Name: 取得 ADO 的版本號(hào)
=============================================================================*/
CString CADOConnection::GetVersion()

{
ASSERT(m_pConnection != NULL);
try
{
return CString(LPCTSTR(_bstr_t(m_pConnection->GetVersion())));//獲取ADO版本信息
}
catch (_com_error e)
{
TRACE(_T("Warning: GetVersion 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return CString(_T(""));
}
}
/**//*=============================================================================
Name: 檢測(cè)連接對(duì)象是否為打開(kāi)狀態(tài).
=============================================================================*/
BOOL CADOConnection::IsOpen()

{
try
{
return (m_pConnection != NULL && (m_pConnection->State & adStateOpen));//是否打開(kāi)狀態(tài)
}
catch (_com_error e)
{
TRACE(_T("Warning: IsOpen 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}

/**//*=============================================================================
Name: 取得對(duì)象的狀態(tài)(同 Recordset 對(duì)象的 GetState 方法).
-------------------------------------------------------------------------------
returns: 返回下列常量之一的長(zhǎng)整型值.
[常量] [說(shuō)明]
-------------------------------------------------------------------------------
adStateClosed 指示對(duì)象是關(guān)閉的.
adStateOpen 指示對(duì)象是打開(kāi)的.
-------------------------------------------------------------------------------
Remarks: 可以隨時(shí)使用 State 屬性取得指定對(duì)象的當(dāng)前狀態(tài).
=============================================================================*/
long CADOConnection::GetState()

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->GetState();//對(duì)象狀態(tài)
}
catch (_com_error e)
{
TRACE(_T("Warning: GetState 發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return -1;
}

/**//*=============================================================================
Name: 取得在 Connection 對(duì)象中修改數(shù)據(jù)的可用權(quán)限.
-------------------------------------------------------------------------------
returns: 返回以下某個(gè) ConnectModeEnum 的值.
[常量] [說(shuō)明]
-------------------------------------------------------------------------------
adModeUnknown 默認(rèn)值. 表明權(quán)限尚未設(shè)置或無(wú)法確定.
adModeRead 表明權(quán)限為只讀.
adModeWrite 表明權(quán)限為只寫(xiě).
adModeReadWrite 表明權(quán)限為讀/寫(xiě).
adModeShareDenyRead 防止其他用戶使用讀權(quán)限打開(kāi)連接.
adModeShareDenyWrite 防止其他用戶使用寫(xiě)權(quán)限打開(kāi)連接.
adModeShareExclusive 防止其他用戶打開(kāi)連接.
adModeShareDenyNone 防止其他用戶使用任何權(quán)限打開(kāi)連接.
-------------------------------------------------------------------------------
Remarks: 使用 Mode 屬性可設(shè)置或返回當(dāng)前連接上提供者正在使用的訪問(wèn)權(quán)限.
=============================================================================*/
ConnectModeEnum CADOConnection::GetMode()

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->GetMode();//獲取連接模式(權(quán)限)
}
catch (_com_error e)
{
TRACE(_T("Warning: GetMode 發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return adModeUnknown;
}
return adModeUnknown;
}

/**//*=============================================================================
Name: 設(shè)置在 Connection 中修改數(shù)據(jù)的可用權(quán)限. 請(qǐng)參考 GetMode 方法.
-------------------------------------------------------------------------------
Remarks: 只能在關(guān)閉 Connection 對(duì)象時(shí)方可設(shè)置 Mode 屬性.
=============================================================================*/
BOOL CADOConnection::SetMode(ConnectModeEnum mode)

{
ASSERT(m_pConnection != NULL);
ASSERT(!IsOpen());
try
{
m_pConnection->PutMode(mode);//設(shè)置連接模式(權(quán)限)
}
catch (_com_error e)
{
TRACE(_T("Warning: SetMode 發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return TRUE;
}

/**//*=============================================================================
Name: 取得連接時(shí)間.
===============================================================================*/
long CADOConnection::GetConnectTimeOut()

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->GetConnectionTimeout();//獲取連接時(shí)間
}
catch (_com_error e)
{
TRACE(_T("Warning: GetConnectTimeOut 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return -1;
}

/**//*========================================================================
Name: 設(shè)置連接時(shí)間.
==========================================================================*/
BOOL CADOConnection::SetConnectTimeOut(long lTime)

{
ASSERT(m_pConnection != NULL);
try
{
m_pConnection->PutConnectionTimeout(lTime);//設(shè)置超時(shí)時(shí)間
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: SetConnectTimeOut 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}

/**//*========================================================================
Name: 從數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)信息.
-----------------------------------------------------
Params: QueryType 所要運(yùn)行的模式查詢類(lèi)型.
-----------------------------------------------------
returns: 返回包含數(shù)據(jù)庫(kù)信息的 Recordset 對(duì)象. Recordset 將以只讀、靜態(tài)
游標(biāo)打開(kāi).
==========================================================================*/
_RecordsetPtr CADOConnection::OpenSchema(SchemaEnum QueryType)

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->OpenSchema(QueryType, vtMissing, vtMissing);//從提供者獲取數(shù)據(jù)庫(kù)模式信息
}
catch(_com_error e)
{
TRACE(_T("Warning: OpenSchema方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
return NULL;
}

/**//*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
------------------------------------------------
事務(wù)處理
------------------------------------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/

/**//*=============================================================================
Name: 開(kāi)始新事務(wù).
-------------------------------------------------------------------------------
returns: 對(duì)于支持嵌套事務(wù)的數(shù)據(jù)庫(kù)來(lái)說(shuō), 在已打開(kāi)的事務(wù)中調(diào)用 BeginTrans
方法將開(kāi)始新的嵌套事務(wù). 返回值將指示嵌套層次: 返回值為 1 表示已打開(kāi)頂層
事務(wù) (即事務(wù)不被另一個(gè)事務(wù)所嵌套), 返回值為 2 表示已打開(kāi)第二層事務(wù)(嵌套
在頂層事務(wù)中的事務(wù)), 依次類(lèi)推.
-------------------------------------------------------------------------------
Remarks: 一旦調(diào)用了 BeginTrans 方法, 在調(diào)用 CommitTrans 或 RollbackTrans
結(jié)束事務(wù)之前, 數(shù)據(jù)庫(kù)將不再立即提交所作的任何更改.
=============================================================================*/
long CADOConnection::BeginTrans()

{
ASSERT(m_pConnection != NULL);
try
{
return m_pConnection->BeginTrans();//開(kāi)始新事務(wù)
}
catch (_com_error e)
{
TRACE(_T("Warning: BeginTrans 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return -1;
}

/**//*=============================================================================
Name: 保存任何更改并結(jié)束當(dāng)前事務(wù).
-------------------------------------------------------------------------------
Remarks: 調(diào)用 CommitTrans 或 RollbackTrans 只影響最新打開(kāi)的事務(wù); 在處理任何
更高層事務(wù)之前必須關(guān)閉或回卷當(dāng)前事務(wù).
=============================================================================*/
BOOL CADOConnection::CommitTrans()

{
ASSERT(m_pConnection != NULL);
try
{
return SUCCEEDED(m_pConnection->CommitTrans());//保存任何更改并結(jié)束當(dāng)前事務(wù)
}
catch (_com_error e)
{
TRACE(_T("Warning: CommitTrans 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}

/**//*=============================================================================
Name: 取消當(dāng)前事務(wù)中所作的任何更改并結(jié)束事務(wù).
==============================================================================*/
BOOL CADOConnection::RollbackTrans()

{
ASSERT(m_pConnection != NULL);
try
{
return SUCCEEDED(m_pConnection->RollbackTrans());//取消當(dāng)前事務(wù)中所作的任何更改并結(jié)束事務(wù)
}
catch (_com_error e)
{
TRACE(_T("Warning: RollbackTrans 方法發(fā)生異常. 錯(cuò)誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}


posted on 2008-06-10 21:20 isabc 閱讀(2167) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): 分享代碼 、數(shù)據(jù)庫(kù)

