?? adorecordset.cpp
字號:
/*########################################################################
Filename: adorecordset.cpp
----------------------------------------------------
Remarks: ...
----------------------------------------------------
Author: 成真
Email: anyou@sina.com
anyou@msn.com
Created: 29/4/2003 8:15
########################################################################*/
#include "stdafx.h"
#include "AdoRecordSet.h"
#include <math.h>
#include <io.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*########################################################################
------------------------------------------------
CAdoRecordSet class 構造/析構函數
------------------------------------------------
########################################################################*/
CAdoRecordSet::CAdoRecordSet()
{
m_pConnection = NULL;
m_SearchDirection = adSearchForward;
m_pRecordset.CreateInstance("ADODB.Recordset");
#ifdef _DEBUG
if (m_pRecordset == NULL)
{
AfxMessageBox("RecordSet 對象創建失敗! 請確認是否初始化了COM環境.");
}
#endif
ASSERT(m_pRecordset != NULL);
}
CAdoRecordSet::CAdoRecordSet(CAdoConnection *pConnection)
{
m_SearchDirection = adSearchForward;
m_pConnection = pConnection;
ASSERT(m_pConnection != NULL);
m_pRecordset.CreateInstance("ADODB.Recordset");
#ifdef _DEBUG
if (m_pRecordset == NULL)
{
AfxMessageBox("RecordSet 對象創建失敗! 請確認是否初始化了COM環境.");
}
#endif
ASSERT(m_pRecordset != NULL);
}
CAdoRecordSet::~CAdoRecordSet()
{
Release();
}
/*========================================================================
Params:
- strSQL: SQL語句, 表名, 存儲過程調用或持久 Recordset 文件名.
- CursorType: 可選. CursorTypeEnum 值, 確定打開 Recordset 時應該
使用的游標類型. 可為下列常量之一.
[常量] [說明]
-----------------------------------------------
adOpenForwardOnly 打開僅向前類型游標.
adOpenKeyset 打開鍵集類型游標.
adOpenDynamic 打開動態類型游標.
adOpenStatic 打開靜態類型游標.
-----------------------------------------------
- LockType: 可選, 確定打開 Recordset 時應該使用的鎖定類型(并發)
的 LockTypeEnum 值, 可為下列常量之一.
[常量] [說明]
-----------------------------------------------
adLockReadOnly 只讀 - 不能改變數據.
adLockPessimistic 保守式鎖定 - 通常通過在編輯時立即鎖定數據源的記錄.
adLockOptimistic 開放式鎖定 - 只在調用 Update 方法時才鎖定記錄.
adLockBatchOptimistic 開放式批更新 - 用于批更新模式(與立即更新模式
相對).
-----------------------------------------------
- lOption 可選. 長整型值, 用于指示 strSQL 參數的類型. 可為下
列常量之一.
[常量] [說明]
-------------------------------------------------
adCmdText 指示strSQL為命令文本, 即普通的SQL語句.
adCmdTable 指示ADO生成SQL查詢返回以 strSQL 命名的表中的
所有行.
adCmdTableDirect 指示所作的更改在strSQL中命名的表中返回所有行.
adCmdStoredProc 指示strSQL為存儲過程.
adCmdUnknown 指示strSQL參數中的命令類型為未知.
adCmdFile 指示應從在strSQL中命名的文件中恢復保留(保存的)
Recordset.
adAsyncExecute 指示應異步執行strSQL.
adAsyncFetch 指示在提取 Initial Fetch Size 屬性中指定的初始
數量后, 應該異步提取所有剩余的行. 如果所需的行尚未
提取, 主要的線程將被堵塞直到行重新可用.
adAsyncFetchNonBlocking 指示主要線程在提取期間從未堵塞. 如果所請求
的行尚未提取, 當前行自動移到文件末尾.
==========================================================================*/
BOOL CAdoRecordSet::Open(LPCTSTR strSQL, long lOption, CursorTypeEnum CursorType, LockTypeEnum LockType)
{
ASSERT(m_pConnection != NULL);
ASSERT(m_pRecordset != NULL);
ASSERT(AfxIsValidString(strSQL));
if(strcmp(strSQL, _T("")) != 0)
{
m_strSQL = strSQL;
}
if (m_pConnection == NULL || m_pRecordset == NULL)
{
return FALSE;
}
if (m_strSQL.IsEmpty())
{
ASSERT(FALSE);
return FALSE;
}
try
{
if (IsOpen()) Close();
return SUCCEEDED(m_pRecordset->Open(_variant_t(LPCTSTR(m_strSQL)),
_variant_t((IDispatch*)m_pConnection->GetConnection(), true),
CursorType, LockType, lOption));
}
catch (_com_error e)
{
TRACE(_T("Warning: 打開記錄集發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
TRACE(_T("%s\r\n"), GetLastError());
return FALSE;
}
}
/*========================================================================
Name: 通過重新執行對象所基于的查詢, 更新 Recordset 對象中的數據.
----------------------------------------------------------
Params: Options 可選. 指示影響該操作選項的位屏蔽. 如果該參數設置
為 adAsyncExecute, 則該操作將異步執行并在它結束時產生
RecordsetChangeComplete 事件
----------------------------------------------------------
Remarks: 通過重新發出原始命令并再次檢索數據, 可使用 Requery 方法刷新
來自數據源的 Recordset 對象的全部內容. 調用該方法等于相繼調用 Close 和
Open 方法. 如果正在編輯當前記錄或者添加新記錄將產生錯誤.
==========================================================================*/
BOOL CAdoRecordSet::Requery(long Options)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Requery(Options) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Requery 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 從基本數據庫刷新當前 Recordset 對象中的數據.
----------------------------------------------------------
Params: AffectRecords: 可選, AffectEnum 值, 決定 Resync 方法所影
響的記錄數目, 可以為下列常量之一.
[常量] [說明]
------------------------------------
adAffectCurrent 只刷新當前記錄.
adAffectGroup 刷新滿足當前 Filter 屬性設置的記錄.只有將 Filter
屬性設置為有效預定義常量之一才能使用該選項.
adAffectAll 默認值.刷新 Recordset 對象中的所有記錄, 包括由
于當前 Filter 屬性設置而隱藏的記錄.
adAffectAllChapters 刷新所有子集記錄.
ResyncValues: 可選, ResyncEnum 值. 指定是否覆蓋基本值. 可為下列
常量之一.
[常量] [說明]
------------------------------------
adResyncAllValues 默認值. 覆蓋數據, 取消掛起的更新.
adResyncUnderlyingValues 不覆蓋數據, 不取消掛起的更新.
----------------------------------------------------------
Remarks: 使用 Resync 方法將當前 Recordset 中的記錄與基本的數據庫重新
同步. 這在使用靜態或僅向前的游標但希望看到基本數據庫中的改動時十分有用.
如果將 CursorLocation 屬性設置為 adUseClient, 則 Resync 僅對非只讀的
Recordset 對象可用.
與 Requery 方法不同, Resync 方法不重新執行 Recordset 對象的基本的命令,
基本的數據庫中的新記錄將不可見.
==========================================================================*/
BOOL CAdoRecordSet::Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Resync(AffectRecords, ResyncValues) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Resync 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 將 Recordset 保存在持久性文件中.
----------------------------------------------------------
Params:
[strFileName]: 可選. 文件的完整路徑名, 用于保存 Recordset.
[PersistFormat]: 可選. PersistFormatEnum 值, 指定保存 Recordset 所使
用的格式. 可以是如下的某個常量:
[常量] [說明]
------------------------------
adPersistADTG 使用專用的"Advanced Data Tablegram"格式保存.
adPersistXML (默認)使用 XML 格式保存.
----------------------------------------------------------
Remarks: 只能對打開的 Recordset 調用 Save 方法. 隨后使用 Load 方法可
以從文件中恢復 Recordset. 如果 Filter 屬性影響 Recordset, 將只保存經過
篩選的行.
在第一次保存 Recordset 時指定 FileName. 如果隨后調用 Save 時, 應忽
略 FileName, 否則將產生運行時錯誤. 如果隨后使用新的 FileName 調用 Save,
那么 Recordset 將保存到新的文件中, 但新文件和原始文件都是打開的.
==========================================================================*/
BOOL CAdoRecordSet::Save(LPCTSTR strFileName, PersistFormatEnum PersistFormat)
{
ASSERT(m_pRecordset != NULL);
ASSERT(IsOpen());
if (m_strFileName == strFileName)
{
strFileName = NULL;
}
else if(_taccess(strFileName, 0) != -1)
{
DeleteFile(strFileName);
m_strFileName = strFileName;
}
else
{
m_strFileName = strFileName;
}
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Save(_bstr_t(strFileName), PersistFormat) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Save 發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::Load(LPCTSTR strFileName)
{
if (IsOpen()) Close();
try
{
return (m_pRecordset->Open(strFileName, "Provider=MSPersist;", adOpenForwardOnly, adLockOptimistic, adCmdFile) == S_OK);
}
catch (_com_error &e)
{
TRACE(_T("Warning: Load 發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
/*========================================================================
Name: 取消執行掛起的異步 Execute 或 Open 方法的調用.
-----------------------------------------------------
Remarks: 使用 Cancel 方法終止執行異步 Execute 或 Open 方法調用(即通
過 adAsyncConnect、adAsyncExecute 或 adAsyncFetch 參數調用的方法).
如果在試圖終止的方法中沒有使用 adAsyncExecute, 則 Cancel 將返回運行
時錯誤.
==========================================================================*/
BOOL CAdoRecordSet::Cancel()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->Cancel();
}
catch (_com_error e)
{
TRACE(_T("Warning: Cancel發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 關閉打開的對象及任何相關對象.
-----------------------------------------------------
Remarks: 使用 Close 方法可關閉 Recordset 對象以便釋放所有關聯的系統
資源. 關閉對象并非將它從內存中刪除, 可以更改它的屬性設置并且在此后
再次打開. 要將對象從內存中完全刪除, 可將對象變量設置為 NULL.
如果正在立即更新模式下進行編輯, 調用Close方法將產生錯誤,應首先
調用 Update 或 CancelUpdat 方法. 如果在批更新期間關閉 Recordset 對
象, 則自上次 UpdateBatch 調用以來所做的修改將全部丟失.
如果使用 Clone 方法創建已打開的 Recordset 對象的副本, 關閉原始
Recordset或其副本將不影響任何其他副本.
==========================================================================*/
void CAdoRecordSet::Close()
{
try
{
if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed)
{
if (GetEditMode() == adEditNone) CancelUpdate();
m_pRecordset->Close();
}
}
catch (const _com_error& e)
{
TRACE(_T("Warning: 關閉記錄集發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
}
/*========================================================================
Name: 關閉連接并釋放對象.
-----------------------------------------------------
Remarks: 關閉連接并釋放CAdoRecordSet對象, 這樣基本上從內容中完全清除了
CAdoRecordSet對象.
==========================================================================*/
void CAdoRecordSet::Release()
{
if (IsOpen()) Close();
m_pRecordset.Release();
m_pRecordset = NULL;
}
/*########################################################################
------------------------------------------------
記錄集更新操作
------------------------------------------------
########################################################################*/
/*========================================================================
Remarks: 開始添加新的紀錄.
==========================================================================*/
BOOL CAdoRecordSet::AddNew()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
if (m_pRecordset->AddNew() == S_OK)
{
return TRUE;
}
}
}
catch (_com_error e)
{
TRACE(_T("Warning: AddNew 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Remarks: 在調用 AddNew 等方法后, 調用此方法完成更新或修改.
==========================================================================*/
BOOL CAdoRecordSet::Update()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
if (m_pRecordset->Update() == S_OK)
{
return TRUE;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -