?? chap10_5.htm
字號:
</td>
<td width="14%">
<p align="JUSTIFY">3
</td>
<td width="18%">
<p align="JUSTIFY">KLAUSENJ
</td>
<td width="19%">
<p align="JUSTIFY">WIL-2033
</td>
<td width="18%">
<p align="JUSTIFY">TTH3-4:30
</td>
<td width="14%">
<p align="JUSTIFY">15
</td>
</tr>
</table>
<b>
<p align="JUSTIFY">清單10.1 派生類中的域數據成員</p>
</b>
<blockquote>
<blockquote> <b> </b>
<p align="JUSTIFY">class CSectionSet : public CRecordset</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">public:</p>
<p align="JUSTIFY"><b>. . . . . .</b></p>
<p align="JUSTIFY">//{{AFX_FIELD(CSectionSet, CRecordset)</p>
<p align="JUSTIFY">CString m_CourseID;</p>
<p align="JUSTIFY">CString m_SectionNo;</p>
<p align="JUSTIFY">CString m_InstructorID;</p>
<p align="JUSTIFY">CString m_RoomNo;</p>
<p align="JUSTIFY">CString m_Schedule;</p>
<p align="JUSTIFY">int m_Capacity;</p>
<p align="JUSTIFY">//}}AFX_FIELD</p>
<p align="JUSTIFY"><b>. . . . . .</b></p>
<p align="JUSTIFY">};</p>
<p align="JUSTIFY"> </p>
</blockquote>
</blockquote>
<p align="JUSTIFY"> 域數據成員用來保存某條記錄的各個字段,它們是程序與記錄之間的緩沖區.域數據成員代表當前記錄,當在記錄集中滾動到某一記錄時,框架自動地把記錄的各個字段拷貝到記錄集對象的域數據成員中.當用戶要修改當前記錄或增加新記錄時,程序先將各字段的新值放入域數據成員中,然后調用相應的CRecordset成員函數把域數據成員設置到數據源中.</p>
<p align="JUSTIFY"> 不難看出,在記錄集與數據源之間有一個數據交換問題.CRecordset類使用"記錄域交換"(Record
Field Exchange,縮寫為RFX)機制自動地在域數據成員和數據源之間交換數據.RFX機制與對話數據交換(DDX)類似.CRecordset的成員函數DoFieldExchange負責數據交換任務,在該函數中調用了一系列RFX函數.當用戶用ClassWizard加入域數據成員時,ClassWizard會自動在DoFieldExchange中建立RFX.典型DoFieldExchange如清單10.2所示:</p>
<p align="JUSTIFY">清單10.2 典型的DoFieldExchange函數</p>
<b></b>
<p align="JUSTIFY">void CSectionSet::DoFieldExchange(CFieldExchange*
pFX)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">//{{AFX_FIELD_MAP(CSectionSet)</p>
<p align="JUSTIFY">pFX->SetFieldType(CFieldExchange::outputColumn);</p>
<p align="JUSTIFY">RFX_Text(pFX, _T("[CourseID]"), m_CourseID);</p>
<p align="JUSTIFY">RFX_Text(pFX, _T("[SectionNo]"), m_SectionNo);</p>
<p align="JUSTIFY">RFX_Text(pFX, _T("[InstructorID]"), m_InstructorID);</p>
<p align="JUSTIFY">RFX_Text(pFX, _T("[RoomNo]"), m_RoomNo);</p>
<p align="JUSTIFY">RFX_Text(pFX, _T("[Schedule]"), m_Schedule);</p>
<p align="JUSTIFY">RFX_Int(pFX, _T("[Capacity]"), m_Capacity);</p>
<p align="JUSTIFY">//}}AFX_FIELD_MAP</p>
<p align="JUSTIFY">}</p>
<p><b> </b></p>
<p align="JUSTIFY"> <b></b> </p>
<p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.5.3
SQL</font><font size="3" color="#3973DE">查詢</font></p>
<p align="JUSTIFY"> 記錄集的建立實際上主要是一個查詢過程,SQL的SELECT語句用來查詢數據源.在建立記錄集時,CRecordset會根據一些參數構造一個SELECT語句來查詢數據源,并用查詢的結果創建記錄集.明白這一點對理解CRecordset至關重要.SELECT語句的句法如下:</p>
<p align="JUSTIFY">SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
</p>
<p align="JUSTIFY">[ORDER BY m_strSort]</p>
<p align="JUSTIFY"><b></b> 其中table-name是表名,rfx-field-list是選擇的列(字段).WHERE和ORDER
BY是兩個子句,分別用來過濾和排序。下面是SELECT語句的一些例子:</p>
<blockquote>
<p align="JUSTIFY">SELECT CourseID, InstructorID FROM Section </p>
<p align="JUSTIFY">SELECT * FROM Section WHERE CourseID=‘MATH202’
AND Capacity=15</p>
<p align="JUSTIFY">SELECT InstructorID FROM Section ORDER BY CourseID
ASC</p>
</blockquote>
<p align="JUSTIFY"> 其中第一個語句從Section表中選擇CourseID和InstructorID字段.第二個語句從Section表中選擇CourseID為MATH202且Capacity等于15的記錄,在該語句中使用了象"AND"或"OR"這樣的邏輯連接符.要注意在SQL語句中引用字符串、日期或時間等類型的數據時要用單引號括起來,而數值型數據則不用.第三個語句從Section表中選擇InstructorID列并且按CourseID的升序排列,若要降序排列,可使用關鍵字DESC.</p>
<div align="center">
<center>
<table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#71D0FF">
<tr>
<td width="100%"> <b></b>提示:如果列名或表名中包含有空格,則必需用方括號把該名稱包起來。例如,如果有一列名為“Client
Name”,則應該寫成“[Client Name]”。<b></b></td>
</tr>
</table>
</center>
</div>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"><font color="#3973DE" face="Times New Roman" size="3">10.5.4
</font><font size="3" color="#3973DE">記錄集的建立和關閉</font></p>
<p align="JUSTIFY"> 要建立記錄集,首先要構造一個CRecordset派生類對象,然后調用Open成員函數查詢數據源中的記錄并建立記錄集.在Open函數中,可能會調用GetDefaultConnect和GetDefaultSQL函數.函數的聲明為</p>
<blockquote>
<blockquote>
<p align="JUSTIFY">CRecordset( CDatabase* pDatabase = NULL);<br>
參數pDatabase指向一個CDatabase對象,用來獲取數據源.如果pDatabase為NULL,則會在Open函數中自動構建一個CDatabase對象.如果CDatabase對象還未與數據源連接,那么在Open函數中會建立連接,連接字符串(參見10.3.1)由成員函數GetDefaultConnect提供.</p>
<p align="JUSTIFY">virtual CString GetDefaultConnect( );<br>
該函數返回缺省的連接字符串.Open函數在必要的時侯會調用該函數獲取連接字符串以建立與數據源的連接.一般需要在CRecordset派生類中覆蓋該函數并在新版的函數中提供連接字符串.</p>
<p align="JUSTIFY">virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );<br>
throw( CDBException, CMemoryException );<br>
該函數使用指定的SQL語句查詢數據源中的記錄并按指定的類型和選項建立記錄集.參數nOpenType說明了記錄集的類型,如表10.3所示,如果要求的類型驅動程序不支持,則函數將產生一個異常.參數lpszSQL是一個SQL的SELECT語句,或是一個表名.函數用lpszSQL來進行查詢,如果該參數為NULL,則函數會調用GetDefaultSQL獲取缺省的SQL語句.參數dwOptions可以是一些選項的組合,常用的選項在表10.4中列出.若創建成功則函數返回TRUE,若函數調用了CDatabase::Open且返回FALSE,則函數返回FALSE.</p>
</blockquote>
</blockquote>
<p><b> </b></p>
<b>
<p align="CENTER">表10.3 記錄集的類型</p>
</b>
<table border="1" cellspacing="1" cellpadding="1" width="579">
<tr>
<td width="39%">
<p align="JUSTIFY">類型
</td>
<td width="61%">
<p align="JUSTIFY">含義
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">AFX_DB_USE_DEFAULT_TYPE
</td>
<td width="61%">
<p align="JUSTIFY">使用缺省值.
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::dynaset
</td>
<td width="61%">
<p align="JUSTIFY">可雙向滾動的動態集.
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::snapshot
</td>
<td width="61%">
<p align="JUSTIFY">可雙向滾動的快照.
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::dynamic
</td>
<td width="61%">
<p align="JUSTIFY">提供比動態集更好的動態特性,大部分ODBC驅動程序不支持這種記錄集.
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::forwardOnly
</td>
<td width="61%">
<p align="JUSTIFY">只能前向滾動的只讀記錄集.
</td>
</tr>
</table>
<p> </p>
<p align="JUSTIFY"> </p>
<p align="CENTER"><b>表10.4 創建記錄集時的常用選項</b></p>
<table border="1" cellspacing="1" cellpadding="1" width="579">
<tr>
<td width="39%">
<p align="JUSTIFY">選項
</td>
<td width="61%">
<p align="JUSTIFY">含義
</td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::none
</td>
<td width="61%">
<p align="JUSTIFY">無選項(缺?。? </td>
</tr>
<tr>
<td width="39%">
<p align="JUSTIFY">CRecordset::appendOnly
</td>
<td width="61%">
<p align="JUSTIFY">不允許修改和刪除記錄,但可以添加記錄.
</td>
</tr>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -