【數據庫】MFC ODBC(三)

四、SQL查詢數據庫

記錄集的創建其實是一個查詢過程,SQL的SELECT語句用來查詢數據源。在創建記錄集時,CRecordset會根據一些參數構造一個SELECT語句來查詢數據源,並用查詢的結果建立記錄集。SELECT語句的句法以下:app

SELECT rfx-field-list FROM table-name [WHERE m_strFilter][ORDER BY m_strSort]框架

其中table-name是表名,rfx-field-list是選擇的列(字段),WHERE和ORDER BY是兩個子句,分別用來過濾和排序。舉例以下:函數

(1)SELECT CourseID, InstructorID FROM Sectionspa

從Section表中選擇CourseID和InstructorID字段。code

(2)SELECT * FROM Section WHERE CourseID='MATH202’ AND Capacity=15對象

從Section表中選擇CourseID爲MATH202且Capacity等於15的記錄。該語句中使用了像AND或OR這樣的邏輯鏈接符。blog

(3)SELECT InstructorID FROM Section ORDER BY CourseID ASC排序

從Section表中選擇InstructorID列而且按CourseID的升序排列,若要降序排列,可以使用關鍵字DESC。ip

注意:

(1)在SQL語句中引用字符串、日期或時間等類型的數據時要用單引號括起來,而數值型數據則不用。

(2)若是列名或表名中包含有空格,則必須用方括號把該名稱包起來。例如,若是有一列名爲「Client Name」,則應該寫成「[Client Name]」。

 

五、記錄集的創建和關閉

要創建記錄集,首先要構造一個CRecordset派生類對象,而後調用Open成員函數查詢數據源中的記錄並創建記錄集。在Open函數中,可能會調用GetDefaultConnect和GetDefaultSQL函數。函數的聲明爲:

CRecordset(CDatabase* pDatabase=NULL);

參數pDatabase指向一個CDatabase對象,用來獲取數據源。若是pDatabase爲NULL,則會在Open函數中自動構建一個CDatabase對象。若是CDatabase對象還未與數據源鏈接,那麼在Open函數中會創建鏈接,鏈接字符串由成員函數GetDefaultConnect提供。

virtual CString GetDefaultConnect( );

該函數返回缺省的鏈接字符串。Open函數在必要的時侯會調用該函數獲取鏈接字符串以創建與數據源的鏈接。通常須要在CRecordset派生類中覆蓋該函數並在新版的函數中提供鏈接字符串。

virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );

該函數使用指定的SQL語句查詢數據源中的記錄並按指定的類型和選項創建記錄集。參數說明以下:

(1)nOpenType

記錄集的類型。若是要求的類型驅動程序不支持,則函數將產生一個異常。

類型

含義

AFX_DB_USE_DEFAULT_TYPE

使用缺省值。

CRecordset::dynaset

可雙向滾動的動態集。

CRecordset::snapshot

可雙向滾動的快照。

CRecordset::dynamic

提供比動態集更好的動態特性,大部分ODBC驅動程序不支持這種記錄集。

CRecordset::forwardOnly

只能前向滾動的只讀記錄集。

 

 

 

 

 

 

 

 

 

 

 

 

(2)lpszSQL

一個SQL的SELECT語句,或是一個表名。函數用lpszSQL來進行查詢,若是該參數爲NULL,則函數會調用GetDefaultSQL獲取缺省的SQL語句。

virtual CString GetDefaultSQL( );

下面舉幾個返回字符串的例子:

「Section」     //選擇Section表中的全部記錄到記錄集中
「Section, Course」 //合併Section表和Course表的各列到記錄集中
//對Section表中的全部記錄按CourseID的升序進行排序,而後創建記錄集
「SELECT * FROM Section ORDER BY CourseID ASC」

(3)dwOptions

一些選項的組合。

選項

含義

CRecordset::none

無選項(缺省)。

CRecordset::appendOnly

不容許修改和刪除記錄,但能夠添加記錄。

CRecordset::readOnly

記錄集是隻讀的。

CRecordset::skipDeletedRecords

有些數據庫(如FoxPro)在刪除記錄時並不真刪除,而是作個刪除標記,在滾動時將跳過這些被刪除的記錄。

 

 

 

 

 

 

 

 

 

 

注意:若是在調用Open時只提供了表名,那麼SELECT語句還缺乏選擇列參數rfx-field-list。框架規定,若是隻提供了表名,則選擇列的信息從DoFieldExchange中的RFX語句裏提取。例如:若是在調用Open時只提供了「Section」表名,那麼將會構造以下一個SELECT語句:

SELECT CourseID,SectionNo,InstructorID,RoomNo,Schedule,Capacity FROM Section

 

六、m_strFilter與m_strSort

創建記錄集後,用戶能夠隨時調用Requery成員函數來從新查詢和創建記錄集。Requery有兩個重要用途:

(1)使記錄集能反映用戶對數據源的改變。

(2)按照新的過濾或排序方法查詢記錄並從新創建記錄集。

在調用Requery以前,可調用CanRestart來判斷記錄集是否支持Requery操做。要記住Requery只能在成功調用Open後調用,因此程序應調用IsOpen來判斷記錄集是否已創建。

virtual BOOL Requery( );
throw( CDBException,CMemoryException );
BOOL CanRestart( ) const; //若支持Requery則返回TRUE

CRecordset類有兩個公共數據成員m_strFilter和m_strSort用來設置對記錄的過濾和排序。在調用Open或Requery前,若是在這兩個數據成員中指定了過濾或排序,那麼Open和Requery將按這兩個數據成員指定的過濾和排序來查詢數據源。

(1)m_strFilter

用於指定過濾器。m_strFilter實際上包含了SQL的WHERE子句的內容,但它不含WHERE關鍵字。例如:

m_pSet->m_strFilter=「CourseID=‘MATH101’」; //只選擇CourseID爲MATH101的記錄

(2)m_strSort

用於指定排序。m_strSort實際上包含了ORDER BY子句的內容,但它不含ORDER BY關鍵字。例如:

m_pSet->m_strSort=「CourseID DESC」; //按CourseID的降序排列記錄

Open函數在構造SELECT語句時,會把m_strFilter和m_strSort的內容放入SELECT語句的WHERE和ORDER BY子句中。若是在Open的lpszSQL參數中已包括了WHERE和ORDER BY子句,那麼m_strFilter和m_strSort必需爲空。

調用無參數成員函數Close能夠關閉記錄集。在調用了Close函數後,程序能夠再次調用Open創建新的記錄集。CRecordset的析構函數會調用Close函數,因此當刪除CRecordset對象時記錄集也隨之關閉。

相關文章
相關標籤/搜索