資料錄集:動態地繫結資料行 (ODBC)
本文件適用於 MFC ODBC 類別。
「資料錄集」會管理您在設計階段所指定繫結的資料表資料行,但在某些情況下,您可能想要在設計階段中繫結未知的資料行。這個主題說明:
可能想要以動態方式將資料行繫結至資料錄集的時機
如何在執行階段動態繫結資料行
注意事項 |
---|
本文件適用於未實作大量資料列擷取的 CRecordset 衍生物件。若您正在使用大量資料列擷取,通常不建議使用所說明的技術。如需關於大量資料列擷取的詳細資訊,請參閱資料錄集:擷取大量資料錄 (ODBC)。 |
您可能動態地繫結資料行的時機
在設計階段時,MFC 應用程式精靈或 MFC ODBC 消費者精靈 (從 [加入類別]) 會根據在資料來源中已知的資料表和資料行,建立資料錄集類別。資料庫可在您設計它們時,和您的應用程式稍後在執行階段所使用的那些資料表和資料行間變動。可能會加入或卸除資料表,或從應用程式資料錄集所依賴的資料表中加入或卸除資料行。可能不是所有資料存取應用程式都該考慮這點,但若此情形發生在您的應用程式上,您應該如何在資料庫結構描述 (Schema) 中妥善處理這個變動,而不需重新設計和重新編譯呢?這個主題的目的是回答該問題。
這個主題說明您可能會動態繫結資料行的常見情況:一開始先根據已知的資料庫結構描述來使用資料錄集,在執行階段中處理其他的資料行。本主題進一步假設,其他的資料行會對應至 CString 欄位資料成員上 (最常見的案例),即使也有提供建議來協助您管理其他資料型別。
只要再加入一小段程式碼,便可以:
決定在執行階段可用的資料行
在執行階段中動態繫結其他的資料行至您的資料錄集
您的資料錄集仍然包含您在設計階段所知資料行的資料成員。也包含少量的額外程式碼,讓您可動態地決定在目標資料表中是否已加入任何新的資料行,若已加入,則繫結這些新的資料行至動態的配置儲存體 (而非繫結至資料錄集的資料成員)。
這個主題並未涵蓋其他的動態繫結案例,如置放資料表或資料行。如需這些案例的詳細資訊,您需要更直接使用 ODBC API 呼叫。如需詳細資訊,請參閱 MSDN Library 光碟片上的《ODBC SDK 程式設計人員參考》。
動態繫結資料行的方式
若要動態繫結資料行,您必須知道或能夠判斷其他資料行的名稱。您也必須為其他的欄位資料成員配置儲存體、指定它們的名稱與型別,並指定您正在加入的資料行數量。
下列的討論會提及兩個不同的資料錄集。第一個是從目標資料表選取資料錄的主資料錄集。第二個是特殊的資料行資料錄集,它是用來取得您的目標資料表內資料行的詳細資訊。
一般處理序
在最普遍的情況,請依照這些步驟:
建構您主要的資料錄集物件。
選擇性地傳遞開啟的 CDatabase 物件的指標,或能以其他方法提供連接資訊至資料行資料錄集。
動態加入資料行的步驟。
請參閱下述「加入資料行」說明的處理程序。
開啟您主要的資料錄集。
資料錄集會選取資料錄及使用資料錄欄位交換 (RFX) 來繫結靜態資料行 (那些對應至資料錄集欄位資料成員的資料行) 和動態資料行 (對應至您配置的額外儲存體)。
加入資料行
在執行階段動態地繫結所加入的資料行需要下列步驟:
在執行階段決定目標資料表中將出現的資料行。從您在設計資料錄集類別時加到資料表的資料行清單中取得資訊。
有一種好的方式是,使用設計來查詢目標資料表的資料行資訊 (例如資料行名稱和資料型別) 的資料行資料錄集類別。
為新的欄位資料成員提供儲存體。因為您的主資料錄集類別並沒有未知資料行的欄位資料成員,所以您必須提供儲存名稱、結果值,以及可能為資料型別資訊 (若資料行是不同的資料型別) 的位置。
一種方法是建置一個或多個動態清單,一個清單是針對新的資料行名稱,另一個清單是針對它們的結果值,第三個清單是針對它們的資料型別 (若有必要)。這些清單,特別是結果值清單,會提供繫結所需的資訊和必要的儲存體。下圖說明建立清單。
建立要動態地繫結的資料行清單
在主資料錄集的 DoFieldExchange 函式中,針對每個加入的資料行加入一個 RFX 函式呼叫。這些 RFX 呼叫可以執行擷取資料錄 (包括其他的資料行),以及將資料行繫結到資料錄集資料成員中,或是您為其動態提供的儲存體。
有一個方法是在主資料錄集的 DoFieldExchange 函式中,加入可循環存取新資料行清單的迴圈 (Loop),為清單中的每個資料行呼叫適當的 RFX 函式。在每個 RFX 呼叫中,傳遞一個資料行名稱清單中的資料行名稱,和一個結果值清單的相對成員之儲存體位置。
資料行清單
以下列出您所需要使用的四個清單:
目前資料表的資料行 (圖例中的清單 1)
這是一份目前在資料來源資料表中的資料行清單。這個清單可能會和目前繫結在資料錄集中的資料行清單相符繫結資料錄集的資料行 (圖示中的清單 2)
一份在您的資料錄集繫結的資料行清單。在您的 DoFieldExchange 函式中,這些資料行已經具有 RFX 陳述式動態繫結的資料行 (圖示中的清單 3)
一份資料表內的資料行清單 (不在您的資料錄集內)。這些是您想要動態繫結的資料行動態資料行值 (圖示中的清單 4)
一份包含擷取自您動態繫結的資料行值之儲存體清單。此清單的項目會一個對一個的對應於「動態繫結的資料行」的項目
建立您的清單
了解常見策略後,可以轉至詳述部分。本主題其他部分的程序,會示範如何建置資料行清單中的清單。這些程序會全程指導您:
決定不在您資料錄集內的資料行名稱
提供動態儲存體給新加入至資料表的資料行
動態地為新的資料行加入 RFX 呼叫
決定不在您資料錄集內的資料表資料行
建置包含已繫結至主資料錄集的資料行清單 (繫結資料錄集的資料行,如圖例中的清單 2 所示)。然後建置一個包含出現在資料來源的資料表內,卻不在您的主資料錄集中的資料行名稱清單 (衍生自「目前資料表的資料行」和「繫結資料錄集的資料行」的「動態繫結的資料行」)。
若要決定不在資料錄集中的資料行名稱 (動態繫結的資料行)
建置一個已繫結到您的主資料錄集的資料行清單 (繫結資料錄集的資料行)。
一種方法是在設計階段中建立「繫結資料錄集的資料行」。您可以檢視判斷資料錄集 DoFieldExchange 函式中的 RFX 函式呼叫,以取得這些名稱。接著,將您的清單設定為以這些名稱初始化的陣列。
例如,圖例中使用了三個項目來說明「繫結資料錄集的資料行」(清單 2)。「繫結資料錄集的資料行」中少了「目前資料表的資料行」(清單 1) 內所示的 Phone 資料行。
比較「目前資料表的資料行」和「繫結資料錄集的資料行」,以便建立一個尚未繫結到您的主資料錄集之資料行清單 (「動態繫結的資料行」)。
一種方法是同時在執行階段中繞著您的資料表內的資料行清單 (目前資料表的資料行) 迴圈,和已繫結到您的資料錄集的資料行清單 (繫結資料錄集的資料行) 迴圈。將「目前資料表的資料行」內所有未出現在「繫結資料錄集的資料行」的名稱放入至「動態繫結的資料行」。
例如,圖例中使用一個項目來說明「動態繫結的資料行」(清單 3):可在「目前資料表的資料行」(清單 1) 內找到的 Phone 資料行,並未出現在「繫結資料錄集的資料行」(清單 2)。
建立「動態的資料行值」的清單 (如圖例所示的清單 4),可在清單中儲存與資料行清單的各個資料行名稱相對應的資料值,以便動態地繫結 (動態繫結的資料行)。
這份清單中的項目會扮演新資料錄集欄位資料成員的角色。它們是動態資料行會繫結到的儲存體位置。如需清單的詳細說明,請參閱資料行清單。
為新的資料行提供儲存體
下一步是設定將動態繫結的資料行之儲存體位置。這個概念是提供一個清單項目來儲存每個資料行值。這些儲存體位置類似於儲存一般繫結資料行的資料錄集成員變數。
提供動態儲存體給新的資料行 (動態資料行值)
建置一個類似「動態繫結的資料行」的「動態資料行值」,以包含每個資料行的資料值。
例如,圖例中使用一個項目來說明「動態資料行值」(清單 4):包含目前資料錄實際電話號碼 (555-1212) 的 CString 物件。
在大多數常見的案例中,「動態資料行值」擁有 CString 型別的項目。如果您正在處理不同資料型別的資料行,您會需要能夠包含多種型別的項目清單。
上述程序的結果是兩個主要的清單:「動態繫結的資料行」包含資料行名稱,而「動態資料行值」包含目前資料錄的資料行值。
提示 |
---|
如果新的資料行不全是相同的資料型別,您可能會想要有額外的類似清單,清單中包含定義資料行清單中每個相對應項目類型的項目 (您可以依需要使用 AFX_RFX_BOOL、AFX_RFX_BYTE 等值。這些常數都定義於 AFXDB.H 中)。根據您表示資料行的資料型別的方式來選擇型別清單。 |
加入 RFX 呼叫以繫結資料行
最後,藉由在您的 DoFieldExchange 函式內為新資料行放置 RFX 呼叫,來安排要發生的動態繫結。
若要動態地為新的資料行加入 RFX 呼叫
- 在主資料錄集的 DoFieldExchange 成員函式中,加入程式碼來產生新資料行清單 (動態繫結的資料行) 的迴圈。在每個迴圈內,自「動態繫結的資料行」擷取一個資料行名稱,並自「動態資料行值」擷取出資料行的結果值。以適合資料行的資料型別來傳遞這些項目至 RFX 函式呼叫。如需清單的詳細說明,請參閱資料行清單。
在一般的情況下,會在 RFX_Text 函式中呼叫從清單中擷取 CString 物件,就如下列數行程式碼所示,這裡的「動態繫結的資料行」是名為 m_listName 的 CStringList,而「動態資料行值」則是稱為 m_listValue 的 CStringList:
RFX_Text( pFX,
m_listName.GetNext( posName ),
m_listValue.GetNext( posValue ));
如需 RFX 函式的詳細資訊,請參閱《類別程式庫參考》的巨集和全域變數。
提示 |
---|
如果新的資料行有不同的資料型別,請在迴圈中使用 Switch 陳述式,為每種型別呼叫適當的 RFX 函式。 |
當架構在 Open 處理程序中呼叫 DoFieldExchange 將資料行繫結至資料錄集時,靜態資料行的 RFX 呼叫會繫結那些資料行。然後您的迴圈會重複地針對動態資料行來呼叫 RFX 函式。