?? chap10_5.htm
字號:
<html>
<head>
<title>10.5 CRecordset類</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<link rel="stylesheet" href="../../../cpcw.css"></head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
<table width="85%" border="0">
<tr bgcolor="#FFFFFF">
<td>
<p align="CENTER"><font face="Times New Roman" color="red"><b>10.5 CRecordset</b></font><b><font color="red">類</font></b></p>
<p align="JUSTIFY"> CRecordset類代表一個記錄集.該類是MFC的ODBC類中最重要、功能最強大的類。</p>
<p align="JUSTIFY"> <b></b><font color="#3973DE" face="Times New Roman" size="3">10.5.1
</font><font size="3" color="#3973DE">動態集、快照、光標和光標庫</font></p>
<p align="JUSTIFY"> 在多任務操作系統或網絡環境中,多個用戶可以共享同一個數據源。共享數據的一個主要問題是如何協調各個用戶對數據源的修改。例如,當某一個應用改變了數據源中的記錄時,別的連接至該數據源的應用應該如何處理。對于這個問題,基于MFC的ODBC應用程序可以采取幾種不同的處理辦法,這將由程序采用哪種記錄集決定。</p>
<p align="JUSTIFY"> 記錄集主要分為快照(Snapshot) 和動態集(Dynaset)兩種,CRecordset類對這兩者都支持。這兩種記錄集的不同表現在它們對別的應用改變數據源記錄采取了不同的處理方法。</p>
<p align="JUSTIFY"> 快照型記錄集提供了對數據的靜態視.快照是個很形象的術語,就好象對數據源的某些記錄照了一張照片一樣.當別的用戶改變了記錄時(包括修改、添加和刪除),快照中的記錄不受影響,也就是說,快照不反映別的用戶對數據源記錄的改變.直到調用了CRecordset::Requery重新查詢后,快照才會反映變化.對于象產生報告或執行計算這樣的不希望中途變動的工作,快照是很有用的。需要指出的是,快照的這種靜態特性是相對于別的用戶而言的,它會正確反映由本身用戶對記錄的修改和刪除,但對于新添加的記錄直到調用Requery后才能反映到快照中.</p>
<p align="JUSTIFY"> 動態集提供了數據的動態視.當別的用戶修改或刪除了記錄集中的記錄時,會在動態集中反映出來:當滾動到修改過的記錄時對其所作的修改會立即反映到動態集中,當記錄被刪除時,MFC代碼會跳過記錄集中的刪除部分.對于其它用戶添加的記錄,直到調用Requery時,才會在動態集中反映出來。本身應用程序對記錄的修改、添加和刪除會反映在動態集中。當數據必須是動態的時侯,使用動態集是最適合的。例如,在一個火車票聯網售票系統中,顯然應該用動態集隨時反映出共享數據的變化。</p>
<p align="JUSTIFY"> 在記錄集中滾動,需要有一個標志來指明滾動后的位置(當前位置)。ODBC驅動程序會維護一個光標,用來跟蹤記錄集的當前記錄,可以把光標理解成跟蹤記錄集位置的一種機制。</p>
<p align="JUSTIFY"> 光標庫(Cursor Library)是處于ODBC驅動程序管理器和驅動程序之間的動態鏈接庫(ODBCCR32.DLL).光標庫的主要功能是支持快照以及為底層驅動程序提供雙向滾動能力,高層次的驅動程序不需要光標庫,因為它們是可滾動的.光標庫管理快照記錄的緩沖區,該緩沖區反映本程序對記錄的修改和刪除,但不反映其它用戶對記錄的改變,由此可見,快照實際上相當于當前的光標庫緩沖區.</p>
<p align="JUSTIFY"> 應注意的是,快照是一種靜態光標(Static Cursor).靜態光標直到滾動到某個記錄才能取得該記錄的數據.因此,要保證所有的記錄都被快照,可以先滾動到記錄集的末尾,然后再滾動到感興趣的第一個記錄上.這樣做的缺點是滾動到末尾需要額外的開銷,會降低性能.</p>
<p align="JUSTIFY"> 與快照不同,動態集不用光標庫維持的緩沖區來存放記錄.實際上,動態集是不使用光標庫的,因為光標庫會屏蔽掉一些支持動態集的底層驅動程序功能.動態集是一種鍵集驅動光標(Keyset-Driven
Cursor),當打開一個動態集時,驅動程序保存記錄集中每個記錄的鍵.只要光標在動態集中滾動,驅動程序就會通過鍵來從數據源中檢取當前記錄,從而保證選取的記錄與數據源同步.</p>
<p align="JUSTIFY"> 從上面的分析中可以看出,快照和動態集有一個共同的特點,那就是在建立記錄集后,記錄集中的成員就已經確定了.這就是為什么兩種記錄集都不能反映別的用戶添加記錄的原因.</p>
<p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.5.2
</font><font size="3" color="#3973DE">域數據成員與數據交換</font></p>
<p align="JUSTIFY"> CRecordset類代表一個記錄集.用戶一般需要用ClassWizard創建一個CRecordset的派生類.ClassWizard可以為派生的記錄集類創建一批數據成員,這些數據成員與記錄的各字段相對應,被稱為字段數據成員或域數據成員.例如,對于表10.2所示的將在后面例子中使用的數據庫表,ClassWizard會在派生類中加入6個域數據成員,如清單10.1所示.可以看出域數據成員與表中的字段名字類似,且類型匹配.</p>
<p align="JUSTIFY"><b> </b></p>
<b>
<p align="CENTER">表10.2 stdreg32.mdb中的Section表</p>
</b>
<table border="1" cellspacing="1" cellpadding="1" width="577">
<tr>
<td width="17%"><b>
<p align="JUSTIFY">CourseID</p>
<p align="JUSTIFY">(Text)
</b></td>
<td width="14%"><b>
<p align="JUSTIFY">SectionNo</p>
<p align="JUSTIFY">(Text)
</b></td>
<td width="18%"><b>
<p align="JUSTIFY">InstructorID</p>
<p align="JUSTIFY">(Text)
</b></td>
<td width="19%"><b>
<p align="JUSTIFY">RoomNo</p>
<p align="JUSTIFY">(Text)
</b></td>
<td width="18%"><b>
<p align="JUSTIFY">Schedule</p>
<p align="JUSTIFY">(Text)
</b></td>
<td width="14%"><b>
<p align="JUSTIFY">Capacity</p>
<p align="JUSTIFY">(int)
</b></td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH101
</td>
<td width="14%">
<p align="JUSTIFY">1
</td>
<td width="18%">
<p align="JUSTIFY">KLAUSENJ
</td>
<td width="19%">
<p align="JUSTIFY">KEN-12
</td>
<td width="18%">
<p align="JUSTIFY">MWF10-11
</td>
<td width="14%">
<p align="JUSTIFY">40
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH101
</td>
<td width="14%">
<p align="JUSTIFY">2
</td>
<td width="18%">
<p align="JUSTIFY">ROGERSN
</td>
<td width="19%">
<p align="JUSTIFY">WIL-1088
</td>
<td width="18%">
<p align="JUSTIFY">TTH3:30-5
</td>
<td width="14%">
<p align="JUSTIFY">15
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH201
</td>
<td width="14%">
<p align="JUSTIFY">1
</td>
<td width="18%">
<p align="JUSTIFY">ROGERSN
</td>
<td width="19%">
<p align="JUSTIFY">WIL-1034
</td>
<td width="18%">
<p align="JUSTIFY">MWF2-3
</td>
<td width="14%">
<p align="JUSTIFY">20
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH201
</td>
<td width="14%">
<p align="JUSTIFY">2
</td>
<td width="18%">
<p align="JUSTIFY">SMITHJ
</td>
<td width="19%">
<p align="JUSTIFY">WIL-1054
</td>
<td width="18%">
<p align="JUSTIFY">MWF3-4
</td>
<td width="14%">
<p align="JUSTIFY">25
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH202
</td>
<td width="14%">
<p align="JUSTIFY">1
</td>
<td width="18%">
<p align="JUSTIFY">KLA
</td>
<td width="19%">
<p align="JUSTIFY">WIL-1054
</td>
<td width="18%">
<p align="JUSTIFY">MWF9-10
</td>
<td width="14%">
<p align="JUSTIFY">20
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH202
</td>
<td width="14%">
<p align="JUSTIFY">2
</td>
<td width="18%">
<p align="JUSTIFY">ROGERSN
</td>
<td width="19%">
<p align="JUSTIFY">KEN-12
</td>
<td width="18%">
<p align="JUSTIFY">TTH9:30-11
</td>
<td width="14%">
<p align="JUSTIFY">15
</td>
</tr>
<tr>
<td width="17%">
<p align="JUSTIFY">MATH202
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -