程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 使用ADO封裝類的數據庫程序開發實例[第二版](下)

使用ADO封裝類的數據庫程序開發實例[第二版](下)

編輯:關於VC++

CAdoRecordSet class:

CAdoRecordSet:

CAdoRecordSet::CAdoRecordSet()

CAdoRecordSet::CAdoRecordSet(CAdoConnection *pConnection)

void CAdoRecordSet::SetAdoConnection(CAdoConnection *pConnection)

創建Connection對象.

Params:

[pConnection]: 連接對象指針.

Open 方法:

BOOL CAdoRecordSet::Open(LPCTSTR strSQL, long lOption, CursorTypeEnum CursorType, LockTypeEnum LockType)

Params:

[strSQL]: SQL語句, 表名, 存儲過程或持久 Recordset 文件名.

[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 指示主要線程在提取期間從未堵塞. 如果所請求的行尚未提取, 當前行自動移到文件末尾.

[CursorType]: 可選. CursorTypeEnum 值, 確定打開 Recordset 時應該使用的游標類型. 可為下列常量之一.

[常量] [說明] adOpenForwardOnly 打開僅向前類型游標. adOpenKeyset 打開鍵集類型游標. adOpenDynamic 打開動態類型游標. adOpenStatic 打開靜態類型游標.

[ LockType]: 可選, 確定打開 Recordset 時應該使用的鎖定類型(並發)的 LockTypeEnum 值, 可為下列常量之一.

[常量] [說明] adLockReadOnly 只讀 - 不能改變數據. adLockPessimistic 保守式鎖定 - 通常通過在編輯時立即鎖定數據源的記錄. adLockOptimistic 開放式鎖定 - 只在調用 Update 方法時才鎖定記錄. adLockBatchOptimistic 開放式批更新 - 用於批更新模式(與立即更新模式相對).

Cancel 方法:

BOOL CAdoRecordSet::Cancel()

取消執行掛起的異步 Execute 或 Open 方法的調用.

Remarks: 使用 Cancel 方法終止執行異步 Execute 或 Open 方法調用(即通過 adAsyncConnect、adAsyncExecute 或 adAsyncFetch 參數調用的方法). 如果在試圖終止的方法中沒有使用 adAsyncExecute, 則 Cancel 將返回運行時錯誤.

Close 方法:

void CAdoRecordSet::Close()

關閉打開的對象及任何相關對象.

Remarks: 使用 Close 方法可關閉 Recordset 對象以便釋放所有關聯的系統資源. 關閉對象並非將它從內存中刪除,

可以更改它的屬性設置並且在此後再次打開. 要將對象從內存中完全刪除, 可將對象變量設置為 NULL.

如果正在立即更新模式下進行編輯, 調用Close方法將產生錯誤,應首先調用 Updat e或 CancelUpdat 方法.

如果在批更新期間關閉 Recordset 對象, 則自上次 UpdateBatch 調用以來所做的修改將全部丟失.

如果使用 Clone 方法創建已打開的 Recordset 對象的副本, 關閉原始Recordset或其副本將不影響任何其他副本.

例1:

if (m_adoConnection.OpenUDLFile("C:\\mm.udl"))
{
  m_adoRecordSet.SetAdoConnection(&m_adoConnection);
  m_adoRecordSet.SetCursorLocation(adUseClient);
  m_adoRecordSet.Open("ado", adCmdTable);
  // 開始事務 ------------------------
  m_adoConnection.BeginTrans();
  bool bSex = false;
  if (m_strSex == "男") bSex = true;
  m_adoRecordSet.AddNew();
  if (!m_adoRecordSet.PutCollect("age", m_nAge)
   || !m_adoRecordSet.PutCollect("length", m_fLength)
   || !m_adoRecordSet.PutCollect("name", m_strName)
   || !m_adoRecordSet.PutCollect("tel", m_strTel)
   || !m_adoRecordSet.PutCollect("money", m_cyMoney)
   || !m_adoRecordSet.PutCollect("date", m_dtDate)
   || !m_adoRecordSet.PutCollect("sex", bSex))
  {
    m_adoRecordSet.CancelUpdate();
    m_adoConnection.RollbackTrans();
  }
  else
  {
    m_adoRecordSet.Update;
    m_adoConnection.CommitTrans();
  }
  
  ....
  if (m_adoRecordSet.GetEditMode() != adEditNone)
  {
    m_adoRecordSet.CancelUpdate();
  }
  m_adoRecordSet.Close();
  
}
else
{
  MessageBox("數據庫連接失敗!");
}

AddNew 方法:

BOOL CAdoRecordSet::AddNew()

Remarks: 開始添加新的紀錄.

Update 方法:

BOOL CAdoRecordSet::Update()

Remarks: 在調用 AddNew 等方法後, 調用此方法完成更新或修改.

UpdateBatch 方法:

BOOL CAdoRecordSet::UpdateBatch(AffectEnum AffectRecords)

Remarks: 將所有掛起的批更新寫入磁盤.

Params: AffectRecords 可選, AffectEnum 值. 決定 UpdateBatch 方法所影響的記錄數目.可以為如下常量之一.

[常量] [說明] adAffectCurrent 只寫入當前記錄的掛起更改. adAffectGroup 寫入滿足當前 Filter 屬性設置的記錄所發生的掛起更改. 必須將 Filter 屬性設置為某個有效的預定義常量才能使用該選項. adAffectAll(默認值) . 寫入 Recordset 對象中所有記錄的掛起更改, 包括由於當前 Filter 屬性設置而隱藏的任何記錄. adAffectAllChapters 寫入所有子集的掛起更改.

Remarks: 按批更新模式修改 Recordset 對象時, 使用 UpdateBatch 方法可將 Recordset 對象中的所有更改傳遞到基本數據庫.

如果 Recordset 對象支持批更新, 那麼可以將一個或多個記錄的多重更改緩存在本地, 然後再調用 UpdateBatch 方法. 如果在調用 UpdateBatch 方法時正在編輯當前記錄或者添加新的記錄, 那麼在將批更新傳送到提供者之前, ADO 將自動 調用 Update 方法保存對當前記錄的所有掛起更改.

只能對鍵集或靜態游標使用批更新.

CancelUpdate 方法:

BOOL CAdoRecordSet::CancelUpdate()

Name: 取消在調用 Update 方法前對當前記錄或新記錄所作的任何更改.

Remarks: 使用 CancelUpdate 方法可取消對當前記錄所作的任何更改或放棄新添加的記錄. 在調用 Update 方法後將無法撤消對當前記錄或新記錄所做的更改, 除非更改是可以用 RollbackTrans 方法回卷的事務的一部分, 或者是可以用 CancelBatch 方法取消的批更新的一部分.

如果在調用 CancelUpdate 方法時添加新記錄, 則調用 AddNew 之前的當前記錄將再次成為當前記錄.

如果尚未更改當前記錄或添加新記錄, 調用 CancelUpdate 方法將產生錯誤.

CancelBatch 方法:

BOOL CAdoRecordSet::CancelBatch(AffectEnum AffectRecords)

Name: 取消掛起的批更新.

Params: AffectRecords 可選的 AffectEnum 值, 決定CancelBatch 方法所影響記錄的數目, 可為下列常量之一:

[常量] [說明] AdAffectCurrent 僅取消當前記錄的掛起更新. AdAffectGroup 對滿足當前 Filter 屬性設置的記錄取消掛起更新.使用該選項時,必須將 Filter 性設置為合法的預定義常量之一. AdAffectAll 默認值 取消 Recordset 對象中所有記錄的掛起更新,包括由當前 Filter 屬性設置所隱藏的任何記錄.

Delete 方法:

BOOL CAdoRecordSet::Delete(AffectEnum AffectRecords)

Params: AffectRecords: AffectEnum 值, 確定 Delete 方法所影響的記錄數目, 該值可以是下列常量之一.

[常量] [說明 ] AdAffectCurrent 默認 僅刪除當前記錄. AdAffectGroup 刪除滿足當前 Filter 屬性設置的記錄. 要使用該選項, 必須將 Filter 屬性設置為有效的預定義常量之一. adAffectAll 刪除所有記錄. adAffectAllChapters 刪除所有子集記錄.

PutCollect/GetCollect 方法:

BOOL PutCollect(long index, const _variant_t &value);

BOOL PutCollect(long index, const CString &value);

BOOL PutCollect(long index, const double &value);

BOOL PutCollect(long index, const float &value);

BOOL PutCollect(long index, const long &value);

BOOL PutCollect(long index, const DWORD &value);

BOOL PutCollect(long index, const int &value);

BOOL PutCollect(long index, const short &value);

BOOL PutCollect(long index, const BYTE &value);

BOOL PutCollect(long index, const bool &value);

BOOL PutCollect(long index, const COleDateTime &value);

BOOL PutCollect(long index, const COleCurrency &value);

BOOL PutCollect(LPCTSTR strFieldName, const _variant_t &value);

BOOL PutCollect(LPCTSTR strFieldName, const CString &value);

BOOL PutCollect(LPCTSTR strFieldName, const double &value);

BOOL PutCollect(LPCTSTR strFieldName, const float &value);

BOOL PutCollect(LPCTSTR strFieldName, const long &value);

BOOL PutCollect(LPCTSTR strFieldName, const DWORD &value);

BOOL PutCollect(LPCTSTR strFieldName, const int &value);

BOOL PutCollect(LPCTSTR strFieldName, const short &value);

BOOL PutCollect(LPCTSTR strFieldName, const BYTE &value);

BOOL PutCollect(LPCTSTR strFieldName, const bool &value);

BOOL PutCollect(LPCTSTR strFieldName, const COleDateTime &value);

BOOL PutCollect(LPCTSTR strFieldName, const COleCurrency &value);

BOOL GetCollect(long index, CString &value);

BOOL GetCollect(long index, double &value);

BOOL GetCollect(long index, float &value);

BOOL GetCollect(long index, long &value);

BOOL GetCollect(long index, DWORD &value);

BOOL GetCollect(long index, int &value);

BOOL GetCollect(long index, short &value);

BOOL GetCollect(long index, BYTE &value);

BOOL GetCollect(long index, bool &value);

BOOL GetCollect(long index, COleDateTime &value);

BOOL GetCollect(long index, COleCurrency &value);

BOOL GetCollect(LPCSTR strFieldName, CString &strValue);

BOOL GetCollect(LPCSTR strFieldName, double &value);

BOOL GetCollect(LPCSTR strFieldName, float &value);

BOOL GetCollect(LPCSTR strFieldName, long &value);

BOOL GetCollect(LPCSTR strFieldName, DWORD &value);

BOOL GetCollect(LPCSTR strFieldName, int &value);

BOOL GetCollect(LPCSTR strFieldName, short &value);

BOOL GetCollect(LPCSTR strFieldName, BYTE &value);

BOOL GetCollect(LPCSTR strFieldName, bool &value);

BOOL GetCollect(LPCSTR strFieldName, COleDateTime &value);

BOOL GetCollect(LPCSTR strFieldName, COleCurrency &value);

在讀取字段的值,本程序做了一些自動的轉換,如: 如果字段的值是以數字組成的字符串,你可以用整型或雙精度的值,直接讀取.

Requery 方法:

BOOL CAdoRecordSet::Requery(long Options)

Name: 通過重新執行對象所基於的查詢, 更新 Recordset 對象中的數據.

Params: Options 可選. 指示影響該操作選項的位屏蔽. 如果該參數設置為 adAsyncExecute, 則該操作將異步執行並在它結束時產生 RecordsetChangeComplete 事件

Remarks: 通過重新發出原始命令並再次檢索數據, 可使用 Requery 方法刷新來自數據源的 Recordset 對象的全部內容. 調用該方法等於相繼調用 Close 和 Open 方法. 如果正在編輯當前記錄或者添加新記錄將產生錯誤.

Resync 方法:

BOOL CAdoRecordSet::Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues)

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 對象的基本的命令, 基本的數據庫中的新記錄將不可見.

Save/Load 方法:

BOOL CAdoRecordSet::Save(LPCTSTR strFileName, PersistFormatEnum PersistFormat)

BOOL CAdoRecordSet::Load(LPCTSTR strFileName)

Name: 將 Recordset 保存在持久性文件中.

Params:

[strFileName]: 可選. 文件的完整路徑名, 用於保存 Recordset.

[PersistFormat]: 可選. PersistFormatEnum 值, 指定保存 Recordset 所使用的格式. 可以是如下的某個常量:

[常量] [說明] adPersistADTG 使用專用的“Advanced Data Tablegram”格式保存. adPersistXML 默認 使用 XML 格式保存.

Remarks: 只能對打開的 Recordset 調用 Save 方法. 隨後使用 Open 方法可以從文件中恢復 Recordset. 如果 Filter 屬性影響 Recordset, 將只保存經過篩選的行.

在第一次保存 Recordset 時指定 FileName. 如果隨後調用 Save 時, 應忽略 FileName, 否則將產生運行時錯誤. 如果隨後使用新的 FileName 調用 Save, 那麼 Recordset 將保存到新的文件中, 但新文件和原始文件都是打開的.

記錄集導航方法:

BOOL CAdoRecordSet::MoveFirst()

BOOL CAdoRecordSet::MoveLast ()

BOOL CAdoRecordSet::MoveNext ()

BOOL CAdoRecordSet::MovePrevious ()

Remarks:

使用 MoveFirst 方法將當前記錄位置移動到 Recordse 中的第一個記錄.

使用 MoveLast 方法將當前記錄位置移動到 Recordset 中的最後一個記錄. Recordset 對象必須支持書簽或向後光標移動; 否則調用該方法將產生錯誤.

使用 MoveNext 方法將當前記錄向前移動一個記錄(向 Recordset 的底部). 如果最後一個記錄是當前記錄並且調用 MoveNext 方法, 則 ADO 將當前記錄設置到 Recordset (EOF為 True)的尾記錄之後. 當 EOF 屬性已經為 True 時試圖向前移動將產生錯誤.

使用 MovePrevious 方法將當前記錄位置向後移動一個記錄(向記錄集的頂部). Recordset 對象必須支持書簽或向後游標移動; 否則方法調用將產生錯誤. 如果首記錄是當前記錄並且調用 MovePrevious 方法, 則 ADO 將當前記錄設置在 Recordset (BOF為True)的首記錄之前. 而BOF屬性為 True 時向後移動將產生錯誤. 如果 Recordse 對象不支持書簽或向後游標移動, 則 MovePrevious 方法將產生錯誤.

如果記錄集是僅向前的, 但是用戶希望支持向前和向後滾動, 則可以使用 CacheSize 屬性創建記錄緩存, 通過 Move 方法支持向後游標移動. 由於緩存記錄是加載到內存中的, 所以應避免不必要地緩存太多記錄. 可以調用僅向前 Recordset 對象的 MoveFirst 方法; 這樣做可使提供者重新執行生成 Recordset 對象的命令.

Move:

BOOL CAdoRecordSet::Move(long lRecords, long Start)

Name: 移動 Recordset 對象中當前記錄的位置.

Params:

[lRecords] 帶符號長整型表達式, 指定當前記錄位置移動的記錄數.

[Start] 可選, 變體型書簽. 也可以使用下列 BookmarkEnum 值:

[常量] [說明] adBookmarkCurrent 默認 從當前記錄開始. adBookmarkFirst 從首記錄開始. adBookmarkLast 從尾記錄開始.

State 屬性:

long CAdoRecordSet::GetState()

BOOL CAdoRecordSet::IsOpen()

Name: 取得記錄集對象的狀態(是打開狀態還是關閉狀態). 對異步方式執行的 Recordset 對象, 則說明當前的對象狀態是連接、執行還是獲取狀態.

returns: 返回下列常量之一的長整型值.

[常量] [說明] adStateClosed 指示對象是關閉的. adStateOpen 指示對象是打開的. adStateConnecting 指示 Recordset 對象正在連接. adStateExecuting 指示 Recordset 對象正在執行命令. adStateFetching 指示 Recordset 對象的行正在被讀取.

Remarks: 可以隨時使用 State 屬性確定指定對象的當前狀態. 該屬性是只讀的. Recordset 對象的 State 屬性可以是組合值. 例如: 如果正在執行語句, 該屬性將是 adStateOpen 和 adStateExecuting 的組合值.

long CAdoRecordSet::GetStatus()

Name: 指示有關批更新或其他大量操作的當前記錄的狀態.

returns: 返回下列一個或多個 RecordStatusEnum 值之和.

[常量] [說明] adRecOK 成功地更新記錄. adRecNew 記錄是新建的. adRecModified 記錄被修改. adRecDeleted 記錄被刪除. adRecUnmodified 記錄沒有修改. adRecInvalid 由於書簽無效, 記錄沒有保存. adRecMultipleChanges 由於影響多個記錄, 因此記錄未被保存. adRecPendingChanges 由於記錄引用掛起的插入, 因此未被保存. adRecCanceled 由於操作被取消, 未保存記錄. adRecCantRelease 由於現有記錄鎖定, 沒有保存新記錄. adRecConcurrencyViolation 由於開放式並發在使用中, 記錄未被保存. adRecIntegrityViolation 由於用戶違反完整性約束, 記錄未被保存. adRecMaxChangesExceeded 由於存在過多掛起更改, 記錄未被保存. adRecObjectOpen 由於與打開的儲存對象沖突, 記錄未被保存. adRecOutOfMemory 由於計算機內存不足, 記錄未被保存. adRecPermissionDenied 由於用戶沒有足夠的權限, 記錄未被保存. adRecSchemaViolation 由於記錄違反基本數據庫的結構, 因此未被保存. adRecDBDeleted 記錄已經從數據源中刪除.

Remarks: 使用 Status 屬性查看在批更新中被修改的記錄有哪些更改被掛起. 也可使用 Status 屬性查看大量操作時失敗記錄的狀態. 例如, 調用 Recordset 對象的 Resync、UpdateBatch 或 CancelBatch 方法, 或者設置 Recordset 對象的 Filter 屬性為書簽數組. 使用該屬性, 可檢查指定記錄為何失敗並將問題解決.

long CAdoRecordSet::GetRecordCount()

Name: 獲取當前記錄集中記錄數目

long CAdoRecordSet::GetFieldsCount()

Name: 獲取當前記錄集中字段數目

BOOL CAdoRecordSet::IsBOF()

Name: 指針是否在在記錄集頭

BOOL CAdoRecordSet::IsEOF()

Name: 指針是否在在記錄集尾

字段屬性:

FieldsPtr CAdoRecordSet::GetFields()

Remarks: Recordset 對象包括 Field 對象組成的 Fields 集合. 每個Field 對象對應 Recordset 集中的一列.

GetField

FieldPtr CAdoRecordSet::GetField(long lIndex)

FieldPtr CAdoRecordSet::GetField(LPCTSTR lpszFieldName)

Name: 取得指定列的字段對象的指針.

FieldName

CString CAdoRecordSet::GetFieldName(long lIndex)

Remarks: 取得指定列字段的字段名.

FieldAttributes:

long CAdoRecordSet::GetFieldAttributes(long lIndex)

long CAdoRecordSet::GetFieldAttributes(LPCTSTR lpszFieldName)

name: 取得 Field 對象一項或多項屬性.

returns: 對於 Field 對象, Attributes 屬性為只讀, 其值可能為以下任意一個或多個 FieldAttributeEnum 值的和.

[常量] [說明] adFldMayDefer 指示字段被延遲, 即不從擁有整個記錄的數據源檢索字段值, 僅在顯式訪問這些字段時才進行檢索. adFldUpdatable 指示可以寫入該字段. adFldUnknownUpdatable 指示提供者無法確定是否可以寫入該字段. adFldFixed 指示該字段包含定長數據. adFldIsNullable 指示該字段接受 Null 值. adFldMayBeNull 指示可以從該字段讀取 Null 值. adFldLong 指示該字段為長二進制字段. 並指示可以使用 AppendChunk 和 GetChunk 方法. adFldRowID 指示字段包含持久的行標識符, 該標識符無法被寫入,並且除了對行進行標識(如記錄號、唯一標識符等)外不存在有意義的值. adFldRowVersion 指示該字段包含用來跟蹤更新的某種時間或日期標記. adFldCacheDeferred 指示提供者緩存了字段值, 並已完成隨後對緩存的讀取.

DefineSize:

long CAdoRecordSet::GetFieldDefineSize(long lIndex)

long CAdoRecordSet::GetFieldDefineSize(LPCTSTR lpszFieldName)

Name: 指示 Field 對象所定義的長度.

returns: 返回某個字段定義的長度(按字節數)的長整型值.

Remarks: 使用 DefinedSize 屬性可確定 Field 對象的數據容量.

ActualSize:

long CAdoRecordSet::GetFieldActualSize(long lIndex)

long CAdoRecordSet::GetFieldActualSize(LPCTSTR lpszFieldName)

Name: 取得字段的值的實際長度.

returns: 返回長整型值.某些提供者允許設置該屬性以便為 BLOB 數據預留空間, 在此情況下默認值為 0.

Remarks: 使用 ActualSize 屬性可返回 Field 對象值的實際長度.對於所有字段,ActualSize 屬性為只讀.如果 ADO 無法確定 Field 對象值的實際長度, ActualSize 屬性將返回 adUnknown. 如以下范例所示, ActualSize 和 DefinedSize 屬性有所不同: adVarChar 聲明類型且最大長度為 50 個字符的 Field 對象將返回為 50 的 DefinedSize 屬性值, 但是返回的 ActualSize 屬性值是當前記錄的字段中存儲的數據的長度.

FieldType:

DWORD CAdoRecordSet::GetFieldType(long lIndex)

DWORD CAdoRecordSet::GetFieldType(LPCTSTR lpszFieldName)

returns: 返回下列值之一. 相應的 OLE DB 類型標識符在下表的說明欄的括號中給出.

[常量] [說明] adArray 與其他類型一起加入邏輯 OR 以指示該數據是那種類型的安全數組 (DBTYPE_ARRAY). adBigInt 8 字節帶符號的整數 (DBTYPE_I8). adBinary 二進制值 (DBTYPE_BYTES). adBoolean 布爾型值 (DBTYPE_BOOL). adByRef 與其他類型一起加入邏輯 OR 以指示該數據是其他類型數據的指針 (DBTYPE_BYREF). adBSTR 以空結尾的字符串 (Unicode) (DBTYPE_BSTR). adChar 字符串值 (DBTYPE_STR). adCurrency 貨幣值 (DBTYPE_CY).貨幣數字的小數點位置固定、小數點右側有四位數字.該值保存為 8 字節范圍為10,000 的帶符號整型值. adDate 日期值 (DBTYPE_DATE).日期按雙精度型數值來保存, 數字全部表示從 1899 年 12 月 30 開始的日期數.小數部分是 一天當中的片段時間. adDBDate 日期值 (yyyymmdd) (DBTYPE_DBDATE). adDBTime 時間值 (hhmmss) (DBTYPE_DBTIME). adDBTimeStamp 時間戳 (yyyymmddhhmmss 加 10 億分之一的小數)(DBTYPE_DBTIMESTAMP). adDecimal 具有固定精度和范圍的精確數字值 (DBTYPE_DECIMAL). adDouble 雙精度浮點值 (DBTYPE_R8). adEmpty 未指定值 (DBTYPE_EMPTY). adError 32 - 位錯誤代碼 (DBTYPE_ERROR). adGUID 全局唯一的標識符 (GUID) (DBTYPE_GUID). adIDispatch OLE 對象上 Idispatch 接口的指針 (DBTYPE_IDISPATCH). adInteger 4 字節的帶符號整型 (DBTYPE_I4). adIUnknown OLE 對象上 IUnknown 接口的指針 (DBTYPE_IUNKNOWN). adLongVarBinary 長二進制值. adLongVarChar 長字符串值. adLongVarWChar 以空結尾的長字符串值. adNumeric 具有固定精度和范圍的精確數字值 (DBTYPE_NUMERIC). adSingle 單精度浮點值 (DBTYPE_R4). adSmallInt 2 字節帶符號整型 (DBTYPE_I2). adTinyInt 1 字節帶符號整型 (DBTYPE_I1). adUnsignedBigInt 8 字節不帶符號整型 (DBTYPE_UI8). adUnsignedInt 4 字節不帶符號整型 (DBTYPE_UI4). adUnsignedSmallInt 2 字節不帶符號整型 (DBTYPE_UI2). adUnsignedTinyInt 1 字節不帶符號整型 (DBTYPE_UI1). adUserDefined 用戶定義的變量 (DBTYPE_UDT). adVarBinary 二進制值. adVarChar 字符串值. adVariant 自動變體型 (DBTYPE_VARIANT). adVector 與其他類型一起加入邏輯 OR 中, 指示數據是 DBVECTOR 結構(由 OLE DB 定義).該結構含有元素的計數和其他類型 (DBTYPE_VECTOR) 數據的指針. adVarWChar 以空結尾的 Unicode 字符串. adWChar 以空結尾的 Unicode 字符串 (DBTYPE_WSTR).

Remarks: 返回指定字段的數據類型.

IsFieldNull:

BOOL CAdoRecordSet::IsFieldNull(LPCTSTR lpFieldName)

BOOL CAdoRecordSet::IsFieldNull(long index)

當前的記錄的指定字段值是否為NULL;

Supports 方法:

BOOL CAdoRecordSet::Supports(CursorOptionEnum CursorOptions)

Name: 確定指定的 Recordset 對象是否支持特定類型的功能.

Params: CursorOptions 長整型, 包括一個或多個下列 CursorOptionEnum 值.

[常量] [說明] adAddNew 可使用 AddNew 方法添加新記錄. adApproxPosition 可讀取並設置 AbsolutePosition 和 AbsolutePage 的屬性. adBookmark 可使用 Bookmark 屬性獲得對特定記錄的訪問. adDelete 可以使用 Delete 方法刪除記錄. adHoldRecords 可以檢索多個記錄或者更改下一個檢索位置而不必提交所有掛起的更改. adMovePrevious 可使用 MoveFirst 和 MovePrevious 方法, 以及 Move 或 GetRows 方法將當前記錄位置向後移動而不必使用書簽. adResync 通過 Resync 方法, 使用在基本的數據庫中可見的數據更新游標. adUpdate 可使用 Update 方法修改現有的數據. adUpdateBatch 可以使用批更新(UpdateBatch 和 CancelBatch 方法) 將更改組傳輸給提供者. adIndex 可以使用 Index 屬性命名索引. adSeek 可以使用 Seek 方法定位 Recordset 中的行.

returns: 返回布爾型值, 指示是否支持 CursorOptions 參數所標識的所有功能.

Remarks: 使用 Supports 方法確定 Recordset 對象所支持的功能類型. 如果 Recordset 對象支持其相應常量在 CursorOptions 中的功能, 那麼 Supports方法返回 True.否則返回 False.

注意 盡管 Supports 方法可對給定的功能返回 True, 但它不能保證提供者可以使功能在所有環境下均有效. Supports 方法只返回提供者是否支持指定的功能(假定符合某些條件). 例如, Supports 方法可能指示 Recordset 對象支持更新 (即使游標基於多個表的合並), 但並且某些列仍然無法更新.

Bookmark 方法:

void CAdoRecordSet::GetBookmark()

獲取當前記錄的書簽.

BOOL CAdoRecordSet::SetBookmark()

將當前記錄移至書簽指向的記錄.

AppendChunk/GetChunk 方法:

BOOL AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes);

BOOL AppendChunk(long index, LPVOID lpData, UINT nBytes);

BOOL AppendChunk(LPCSTR strFieldName, LPVOID lpData, UINT nBytes);

BOOL AppendChunk(long index, LPCTSTR lpszFileName);

BOOL AppendChunk(LPCSTR strFieldName, LPCTSTR lpszFileName);

BOOL GetChunk(FieldPtr pField, LPVOID lpData);

BOOL GetChunk(long index, LPVOID lpData);

BOOL GetChunk(LPCSTR strFieldName, LPVOID lpData);

BOOL GetChunk(long index, CBitmap &bitmap);

BOOL GetChunk(LPCSTR strFieldName, CBitmap &bitmap);

寫入或取出BLOB數據

strFieldName 文件名:

lpData 指向緩沖區的指針:

nBytes 要寫入或讀出的數據的字節數:

例如:

// 寫入 ----------------
m_adoRecordSet.AddNew();
m_adoRecordSet.SetFieldValue("ID", 5);
m_adoRecordSet.AppendChunk("Document", "C:\\doc1.txt");
m_adoRecordSet.Update();
// 讀取 ----------------
long size = GetFieldActualSize(strFieldName);
if ((adFldLong & GetFieldAttributes(strFieldName)) && size > 0)
{
  BYTE *lpData = new BYTE[size];
    
  if (GetChunk(GetField(strFieldName), (LPVOID)lpData))
  {
    .....
    DoSomeThing();
    
  }
  delete[] lpData;
  lpData = NULL;  
}

Clone 方法:

BOOL CAdoRecordSet::Clone(CAdoRecordSet &pRecordSet)

克隆一份副本

Find 方法:

BOOL CAdoRecordSet::Find(LPCTSTR lpszFind, SearchDirectionEnum SearchDirection)

BOOL CAdoRecordSet::FindFirst(LPCTSTR lpszFind)

查找滿足條件的記錄.

Filter 方法:

BOOL CAdoRecordSet::SetFilter(LPCTSTR lpszFilter)

過濾出滿足條件的記錄.

CAdoRecordset m_pRs;
m_pRs = CAdoRecordSet(&m_pConnection);
if(m_pRs.Open("ado", CADORecordset::openTable))
{
  CString strFilter = _T("Name <> ''anyou'' And Age > 20");
  m_pRs.SetFilter(strFilter);
  .
  .
  m_pRs.Close();
}

Sort 方法:

BOOL CAdoRecordSet::SetSort(LPCTSTR lpszCriteria)

使記錄集以指定的字段排序.

EditMode 屬性:

EditModeEnum CAdoRecordSet::GetEditMode()

根據當前的EditMode屬性,你可以確定要不要Update 或 CancelUpdate!

AbsolutePage 屬性:

BOOL CAdoRecordSet::SetAbsolutePage(int nPage)

long CAdoRecordSet::GetAbsolutePage()

name: 當前記錄所在的頁.

returns: 置或返回從 1 到 Recordset 對象 (PageCount) 所含頁數的長整型值,或者返回以下常量。

[常量] [說明] adPosUnknown Recordset 為空,當前位置未知,或者提供者不支持 AbsolutePage 屬性。 adPosBOF 當前記錄指針位於 BOF(即 BOF 屬性為 True)。 adPosEOF 當前記錄指針位於 EOF(即 EOF 屬性為 True)。

AbsolutePosition 屬性:

BOOL CAdoRecordSet::SetAbsolutePosition(int nPosition)

long CAdoRecordSet::GetAbsolutePosition()

name: Recordset 對象當前記錄的序號位置。

returns: 設置或返回從 1 到 Recordset 對象 (PageCount) 所含頁數的長整型值,或者返回以下常量。

[常量] [說明] adPosUnknown Recordset 為空,當前位置未知,或者提供者不支持 AbsolutePosition 屬性。 adPosBOF 當前記錄指針位於 BOF(即 BOF 屬性為 True)。 adPosEOF 當前記錄指針位於 EOF(即 EOF 屬性為 True)。

Remarks: 使用 AbsolutePosition 屬性可根據其在 Recordset 中的序號 位置移動到記錄,或確定當前記錄的序號位置。提供者必須支持該屬性的相應功能才能使用該屬性。

同 AbsolutePage 屬性一樣,AbsolutePosition 從 1 開始,並在當前記錄 為 Recordset 中的第一個記錄時等於 1。從 RecordCount 屬性可獲得 Recordset 對象的總記錄數。

設置 AbsolutePosition 屬性時,即使該屬性指向位於當前緩存中的記錄,ADO 也將使用以指定的記錄開始的新記錄組重新加載緩存。CacheSize 屬性決定該記錄組的大小。

注意 不能將 AbsolutePosition 屬性作為替代的記錄編號使用。刪除前面的記錄時,給定記錄的當前位置將發生改變。如果 Recordset 對象被重新查詢或重新打開,則無法保證給定記錄有相同的 AbsolutePosition。書簽仍然是保持和返回給定位置的推薦方式,並且在所有類型的 Recordset 對象的定位時是唯一的方式。

如何與DataGrid控件進行綁定:

if (m_adoConnection.ConnectAccess("database.mdb"))
{
  m_adoRecordSet.SetAdoConnection(&m_adoConnection);
  // 這一步不能少,只有設成adUseClient才能進行綁定.
  m_adoRecordSet.SetCursorLocation(adUseClient);
  if (m_adoRecordSet.Open(lpszPathName, adCmdTable))
  {
    m_wndDataGrid.SetCaption(GetDocument()->GetPathName());
    m_wndDataGrid.SetRefDataSource(NULL);
    // 綁定數據源 ---------------------------.
    m_wndDataGrid.SetRefDataSource((LPUNKNOWN)(m_adoRecordSet.GetRecordset()));
    // 充許更新修改數據 ---------------------
    m_wndDataGrid.SetAllowAddNew(TRUE);
    m_wndDataGrid.SetAllowDelete(TRUE);
    m_wndDataGrid.SetAllowUpdate(TRUE);
    m_wndDataGrid.Refresh();
  }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved