資料錄集:參數化資料錄集 (ODBC)
本文件適用於 MFC ODBC 類別。
有時您可能想要使用計算出來或從使用者處取得的資訊,在執行階段時選取資料錄。 您可以使用資料錄集的參數達成這個目的。
這個主題會說明:
參數型資料錄集的目的。
參數化資料錄集的時機和原因。
資料錄集類別的參數資料成員的宣告方法。
在 Run Time 將參數資訊傳遞至資料錄集物件的方法。
參數型資料錄集
參數型資料錄集讓您可以在執行階段中傳遞參數。 這點帶來兩項有意義的影響:
這可能會產生更快的執行速度。
讓您在執行階段時,根據在設計階段無法取得的資訊 (例如自您的使用者處取得或是在 Run Time 中計算所得的資訊) 建置一個查詢。
當您呼叫 Open 來執行查詢時,資料錄集會使用參數資訊來完成它的 SQL SELECT 陳述式。 您可以參數化任何資料錄集。
參數使用時機
參數的一般用法包括:
傳遞執行階段引數至預先定義的查詢。
若要將參數傳遞至預存程序,您必須指定一個完整的自訂 ODBC CALL 陳述式 ─ 使用參數替代符號 ─ 當您在呼叫 Open 以覆寫資料錄集的預設 SQL 陳述式時。 如需詳細資訊,請參閱《類別庫參考》中的 CRecordset::Open 以及 SQL:自訂資料錄集的 SQL 陳述式 (ODBC) 和資料錄集:宣告預先定義查詢的類別 (ODBC)。
有效率地以不同的參數資訊來執行許多種需求。
例如,每當您的使用者在查詢學生註冊資料庫的特定學生資訊時,您可指定學生姓名或 ID 當做從使用者處取得的參數。 接著當您呼叫資料錄集的 Requery 成員函式時,查詢只會選取該學生的資料錄。
儲存於 m_strFilter 內的資料錄集篩選字串看起來可能像這樣:
"StudentID = ?"
假設您取得在 strInputID 變數內的學生 ID。 則當您設定參數為 strInputID 時 (例如,學生 ID 100),變數值便會繫結至篩選字串中以 "?" 表示的參數替代符號 (Placeholder)。
依照下列方式指定參數值:
strInputID = "100"; ... m_strParam = strInputID;
您不會想要以這種方式設定篩選條件字串:
m_strFilter = "StudentID = 100"; // 100 is incorrectly quoted // for some drivers
如需如何在篩選字串中正確使用引號的詳細討論,請參閱資料錄集:篩選資料錄 (ODBC)。
每次您在重新查詢資料錄集的新學生 ID 時所使用的參數值都會不一樣。
秘訣 使用參數比只用篩選條件還要更有效率。 針對一個參數型資料錄集,資料庫只處理 SQL SELECT 陳述式一次。 針對不含參數的篩選型資料錄集,SELECT 陳述式會在每次您以一個新的篩選值 Requery 時進行處理。
如需篩選條件的詳細資訊,請參閱資料錄:篩選資料錄 (ODBC)。
參數化資料錄集類別
注意事項 |
---|
本章節適用於尚未實作大量資料列擷取的 CRecordset 衍生物件。 若您正在使用大量資料列擷取,實作參數是一個類似的處理程序。 如需詳細資訊,請參閱資料錄集:擷取大量資料錄 (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 函式呼叫 (Function Call)。 如需撰寫 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 (針對現有資料錄集物件) 前先指定參數值。
若要在執行階段將參數值傳遞至資料錄集物件
建構資料錄集物件。
準備一個字串或一群字串,例如 m_strFilter 字串,此字串包含 SQL 陳述式,或部分的陳述式。 在接收參數資訊的地方放置一個 "?" 替代符號。
為物件的每個參數資料成員設定執行階段參數值。
呼叫 Open 成員函式 (對現有資料錄集則是呼叫 Requery)。
例如,假設您想要為使用執行階段取得的資訊之資料錄集,指定一個篩選字串。 假設您先前已建構了 CStudentSet 類別的資料錄集 (稱為 rsStudent),而現在想要重新查詢以便取得特定類型的學生資訊。
// 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。 |