資料錄集:參數化資料錄集 (ODBC)
本主題適用於 MFC ODBC 類別。
有時您可能會想要使用您所計算出來或從使用者取得的資訊,在執行階段選取資料錄。 資料錄集參數可讓您達成該目標。
本主題將說明:
參數化記錄集
參數化的資料錄集可讓您在執行階段傳遞參數資訊。 這能提供兩個重要的效果:
它可能可以帶來更佳的執行速度。
它能讓您根據在設計階段無法取得的資訊在執行階段建置查詢,例如在執行階段從使用者取得或計算出來的資訊。
當您呼叫 Open
來執行查詢時,資料錄集會使用參數資訊來完成其 SQL SELECT 陳述式。 您可以參數化任何資料錄集。
使用參數的時機
參數的典型用途包括:
將執行階段引數傳遞至預先定義的查詢。
若要將參數傳遞至預存程序,您必須在呼叫
Open
時指定完整的自訂 ODBC CALL 陳述式 (搭配參數預留位置),並覆寫資料錄集的預設 SQL 陳述式。 如需詳細資訊,請參閱類別庫中的 CRecordset::Open 和 SQL:自定義記錄集的 SQL 語句 (ODBC) 和 Recordset:宣告預先定義查詢的類別 (ODBC)。搭配不同的參數資訊有效執行數個重新查詢。
例如,每當您的使用者在學生註冊資料庫中查詢特定學生的資訊時,您可以將該學生的姓名或識別碼指定為從該使用者取得的參數。 接著,當您呼叫資料錄集的
Requery
成員函式時,查詢便只會選取該學生的記錄。您的資料錄集篩選字串 (儲存在
m_strFilter
中) 看起來可能會像這樣:"StudentID = ?"
假設您是在變數
strInputID
中取得學生識別碼。 當您將參數設定為strInputID
(例如學生識別碼 100) 時,變數的值會繫結至在篩選字串中由 "?" 所代表的參數預留位置。指派參數值,如下所示:
strInputID = "100"; ... m_strParam = strInputID;
您不應該以下列方式設定篩選字串:
m_strFilter = "StudentID = 100"; // 100 is incorrectly quoted // for some drivers
如需如何正確使用引號來篩選字串的討論,請參閱 Recordset:篩選記錄 (ODBC) 。
每當您針對新的學生識別碼重新查詢資料錄集時,參數值都會不同。
提示
使用參數比起單純使用篩選還要更有效率。 針對參數化的資料錄集,資料庫只能單次處理 SQL SELECT 陳述式。 針對沒有參數的已篩選資料錄集,在您每次搭配新的篩選值進行
Requery
時,都必須處理 SELECT 陳述式。
如需篩選的詳細資訊,請參閱 記錄集:篩選記錄 (ODBC)。
將 Recordset 類別參數化
注意
本節適用於衍生自 CRecordset
的物件,其中尚未實作大量資料列擷取。 如果您正在使用大量資料列擷取,其實作參數的程序也相當類似。 如需詳細資訊,請參閱 記錄集:大量擷取記錄 (ODBC)。
在您建立資料錄集類別之前,請先判斷所需的參數、其資料類型,以及資料錄集使用它們的方式。
參數化資料錄集類別
注意
Visual Studio 2019 和更新版本中未提供 MFC ODBC 消費者精靈。 您仍然可以手動建立此功能。
從 [新增類別] 執行 MFC ODBC 消費者精靈來建立該類別。
針對資料錄集的資料行指定欄位資料成員。
在精靈將類別寫入您專案中的檔案後,請移至 .h 檔案並手動將一或多個參數資料成員加入類別宣告。 結果看起來可能會類似下列範例,其為設計來回答查詢「有哪些學生屬於高年級班級?」之快照集類別的一部分。
class CStudentSet : public CRecordset { // Field/Param Data CString m_strFirstName; CString m_strLastName; CString m_strStudentID; CString m_strGradYear; CString m_strGradYrParam; };
將您的參數資料成員加入至由精靈產生之欄位資料成員的後方。 慣例是將文字 "Param" 附加至每個使用者定義的參數名稱。
修改 .cpp 檔案中的 DoFieldExchange 成員函式定義。 針對每個您加入類別的參數資料成員加入 RFX 函式呼叫。 如需撰寫 RFX 函式的相關信息,請參閱 記錄字段交換:RFX 的運作方式。 在進行對參數的 RFX 呼叫之前,先針對下列項目進行單一呼叫:
pFX->SetFieldType( CFieldExchange::param ); // RFX calls for parameter data members
在您資料錄集類別的建構函式中累加參數的計數,
m_nParams
。如需詳細資訊,請參閱 記錄字段交換:使用精靈程序代碼。
當您撰寫會建立此類別之資料錄集物件的程式碼時,請在 SQL 陳述式字串中會取代參數的每個位置放置 "?" (問號) 符號。
在執行階段時,"?" 預留位置會依序被您所傳遞的參數值填入。 在 SetFieldType 呼叫後所設定的第一個參數資料成員將會取代 SQL 字串中的第一個 "?",而第二個參數資料成員則會取代第二個 "?",依此類推。
注意
參數順序很重要:針對您 DoFieldExchange
函式中參數的 RFX 呼叫順序,必須符合您 SQL 字串中參數預留位置的順序。
提示
最可能搭配使用的字串,是您針對類別的 m_strFilter 資料成員所指定的字串 (若有的話),但某些 ODBC 驅動程式可能會允許其他 SQL 子句中的參數。
在運行時間傳遞參數值
您必須在呼叫 Open
(針對新的資料錄集物件) 或 Requery
(針對現有資料錄集物件) 之前指定參數值。
在執行階段將參數值傳遞至資料錄集物件
建構資料錄集物件。
準備包含 SQL 陳述式 (或部分陳述式) 的字串,例如
m_strFilter
字串。 將 "?" 預留位置置於要填入參數資訊的位置。將執行階段參數值指派至物件的每個參數資料成員。
呼叫
Open
成員函式 (針對現有的資料錄集則是Requery
)。
例如,假設您想要使用在執行階段取得的資訊,為您的資料錄集指定篩選字串。 假設您已預先建構類別 CStudentSet
的資料錄集 (稱為 rsStudents
),且現在想要重新查詢它以取得特定類型的學生資訊。
// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";
// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );
// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;
// Run the query
if( !rsStudents.Requery( ) )
return FALSE;
資料錄集包含其記錄符合由篩選所指定條件之學生的記錄,該篩選是根據執行階段參數所建構。 在此情況下,資料錄集會包含所有高年級學生的記錄。
注意
若有需要,您可以使用 SetParamNull 將參數資料成員的值設為 Null。 您也可以使用 IsFieldNull 來檢查是否有參數資料成員為 Null。
另請參閱
資料錄集 (ODBC)
資料錄集:新增、更新和刪除資料錄 (ODBC)
資料錄集:資料錄集選取資料錄的方式 (ODBC)