Sada záznamů: Dynamické vazby datových sloupců (ODBC)
Toto téma se vztahuje na třídy MFC ODBC.
Sady záznamů spravují sloupce tabulky vazby, které zadáte v době návrhu, ale existují případy, kdy můžete chtít svázat sloupce, které byly v době návrhu neznámé. Toto téma vysvětluje:
Poznámka:
Toto téma se vztahuje na objekty odvozené z toho, ze CRecordset
kterých hromadné načítání řádků nebylo implementováno. Obecně popsané techniky se nedoporučuje, pokud používáte hromadné načítání řádků. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Kdy můžete dynamicky svázat sloupce
Poznámka:
Průvodce příjemcem rozhraní ODBC MFC není v sadě Visual Studio 2019 a novější k dispozici. Příjemce můžete přesto vytvořit ručně.
V době návrhu průvodce aplikací MFC nebo Průvodce příjemcem rozhraní MFC ODBC (z třídy Přidat třídu) vytvoří třídy sady záznamů založené na známých tabulkách a sloupcích ve zdroji dat. Databáze se můžou změnit mezi tím, kdy je navrhujete a později, když aplikace tyto tabulky a sloupce používá za běhu. Vy nebo jiný uživatel můžete přidat nebo odstranit tabulku nebo přidat nebo vložit sloupce z tabulky, na které sada záznamů vaší aplikace spoléhá. Pravděpodobně to není problém pro všechny aplikace pro přístup k datům, ale pokud je pro vás, jak se můžete vypořádat se změnami schématu databáze, kromě přepracováním a rekompilováním? Účelem tohoto tématu je odpovědět na tuto otázku.
Toto téma popisuje nejběžnější případ, kdy můžete dynamicky svázat sloupce – když jste začali se sadou záznamů na základě známého schématu databáze, chcete zpracovat další sloupce za běhu. Toto téma dále předpokládá, že další sloupce se mapují na CString
datové členy polí, nejběžnější případ, i když jsou k dispozici návrhy, které vám pomůžou se správou jiných datových typů.
S malým množstvím nadbytečného kódu můžete:
Sada záznamů stále obsahuje datové členy pro sloupce, o kterých jste věděli v době návrhu. Obsahuje také malý objem dodatečného kódu, který dynamicky určuje, jestli byly do cílové tabulky přidány nějaké nové sloupce, a pokud ano, vytvoří vazbu těchto nových sloupců na dynamicky přidělené úložiště (nikoli na členy sady dat sady záznamů).
Toto téma se nezabývá jinými případy dynamické vazby, jako jsou vyřazené tabulky nebo sloupce. V takových případech je potřeba použít přímo volání rozhraní ODBC API. Informace naleznete v tématu Odbc Programmer's Reference.
Jak dynamicky svázat sloupce
Pokud chcete sloupce svázat dynamicky, musíte znát (nebo být schopni určit) názvy dalších sloupců. Musíte také přidělit úložiště pro další datové členy pole, zadat jejich názvy a jejich typy a zadat počet sloupců, které přidáváte.
V následující diskuzi najdete dvě různé sady záznamů. První je hlavní sada záznamů, která vybírá záznamy z cílové tabulky. Druhou je speciální sada záznamů sloupců, která slouží k získání informací o sloupcích v cílové tabulce.
Obecný proces
Na nejzobecnější úrovni postupujte takto:
Vytvořte hlavní objekt sady záznamů.
Volitelně můžete předat ukazatel na otevřený
CDatabase
objekt nebo být schopen poskytnout informace o připojení sadě záznamů sloupce jiným způsobem.Proveďte kroky pro dynamické přidávání sloupců.
Podívejte se na postup popsaný v části Přidání sloupců níže.
Otevřete hlavní sadu záznamů.
Sada záznamů vybere záznamy a použije výměnu polí záznamů (RFX) k vytvoření vazby statických sloupců (mapovaných na datové členy sady záznamů) a dynamických sloupců (namapovaných na extra úložiště, které přidělíte).
Přidání sloupců
Dynamické vazby přidané sloupce za běhu vyžadují následující kroky:
Určete v době běhu, které sloupce jsou v cílové tabulce. Extrahujte z těchto informací seznam sloupců, které byly přidány do tabulky od doby, kdy byla třída sady záznamů navržena.
Dobrým přístupem je použít třídu sady záznamů sloupců navrženou k dotazování zdroje dat na informace o sloupci pro cílovou tabulku (například název sloupce a datový typ).
Zadejte úložiště pro nové datové členy pole. Protože vaše hlavní třída sady záznamů neobsahuje datové členy polí pro neznámé sloupce, musíte zadat místo pro uložení názvů, výsledných hodnot a informací o datovém typu (pokud jsou sloupce jiné datové typy).
Jedním z přístupů je vytvoření jednoho nebo více dynamických seznamů, jeden pro názvy nových sloupců, druhý pro jejich výsledné hodnoty a třetí pro jejich datové typy (v případě potřeby). Tyto seznamy, zejména seznam hodnot, poskytují informace a nezbytné úložiště pro vazbu. Následující obrázek znázorňuje vytváření seznamů.
Vytváření seznamů sloupců, které se mají dynamicky svázatPřidejte volání funkce RFX do funkce hlavní sady
DoFieldExchange
záznamů pro každý přidaný sloupec. Tato volání RFX provádí načtení záznamu, včetně dalších sloupců, a vytvoření vazby sloupců k datovým členům sady záznamů nebo k dynamicky zadanému úložišti.Jedním z přístupů je přidání smyčky do funkce hlavní sady
DoFieldExchange
záznamů, která prochází seznamem nových sloupců a volá příslušnou funkci RFX pro každý sloupec v seznamu. Při každém volání RFX předejte název sloupce ze seznamu názvů sloupců a umístění úložiště v odpovídajícím členu seznamu hodnot výsledků.
Seznamy sloupců
V následující tabulce jsou uvedené čtyři seznamy, se kterými potřebujete pracovat.
Seznam | Popis |
---|---|
Sloupce current-table-columns | (Seznam 1 na obrázku) Seznam sloupců aktuálně v tabulce ve zdroji dat. Tento seznam se může shodovat se seznamem sloupců aktuálně vázaných v sadě záznamů. |
Vázaná sada záznamů – sloupce | (Seznam 2 na obrázku) Seznam sloupců vázaných v sadě záznamů Tyto sloupce už mají ve vaší DoFieldExchange funkci příkazy RFX. |
Sloupce s vazbou dynamicky | (Seznam 3 na obrázku) Seznam sloupců v tabulce, ale ne v sadě záznamů. Jedná se o sloupce, které chcete dynamicky svázat. |
Dynamické hodnoty sloupců | (Seznam 4 na obrázku) Seznam obsahující úložiště pro hodnoty načtené ze sloupců, které dynamicky svážete. Prvky tohoto seznamu odpovídají prvkům v sloupcích s dynamickou vazbou, jedna k jedné. |
Vytváření seznamů
S ohledem na obecnou strategii se můžete obrátit na podrobnosti. Postupy ve zbytku tohoto tématu ukazují, jak vytvořit seznamy zobrazené v seznamech sloupců. Postupy vás provedou následujícími postupy:
Určení sloupců tabulky, které nejsou v sadě záznamů
Vytvořte seznam (bound-Recordset-Columns, as in List 2 na obrázku), který obsahuje seznam sloupců, které jsou již svázané v hlavní sadě záznamů. Potom sestavte seznam (sloupce k dynamické vazbě odvozené ze sloupců Current-Table-Columns a Bound-Recordset-Columns), který obsahuje názvy sloupců v tabulce ve zdroji dat, ale ne v hlavní sadě záznamů.
Určení názvů sloupců, které nejsou v sadě záznamů (sloupce s vazbou dynamicky)
Vytvořte seznam (Bound-Recordset-Columns) sloupců, které jsou již vázané v hlavní sadě záznamů.
Jedním z přístupů je vytvoření sloupců bound-Recordset-Columns v době návrhu. Můžete vizuálně prozkoumat volání funkce RFX ve funkci sady
DoFieldExchange
záznamů, abyste získali tyto názvy. Potom seznam nastavte jako pole inicializované s názvy.Na obrázku je například znázorněno vázané sloupce sady záznamů (Seznam 2) se třemi prvky. Ve sloupcích Current-Table-Columns (Seznam 1) chybí sloupec Bound-Recordset-Columns ( Phone).
Porovnejte sloupce Current-Table-Columns a Bound-Recordset-Columns a sestavte seznam (Sloupce-to-Bind-Dynamicky) sloupců, které ještě nejsou vázané v hlavní sadě záznamů.
Jedním z přístupů je paralelně procházet seznam sloupců v tabulce za běhu (Current-Table-Columns) a seznam sloupců, které jsou už vázané v sadě záznamů (Bound-Recordset-Columns). Do sloupců s vazbou dynamicky vložte jakékoli názvy do sloupců Current-Table-Columns, které se nezobrazují ve sloupcích bound-Recordset-Columns.
Na obrázku je například sloupec Sloupce-to-Bind-Dynamicky (Seznam 3) s jedním prvkem: sloupec Phone nalezený ve sloupcích Current-Table-Columns (List 1), ale ne ve sloupcích bound-Recordset-Columns (List 2).
Vytvořte seznam dynamických hodnot sloupců (jako v seznamu 4 na obrázku), do kterého se mají ukládat datové hodnoty odpovídající názvům jednotlivých sloupců uloženým v seznamu sloupců, které se mají dynamicky svázat (sloupce-to-Bind-Dynamicly).
Prvky tohoto seznamu hrají roli nových datových členů sady záznamů. Jedná se o umístění úložiště, ke kterým jsou dynamické sloupce vázané. Popisy seznamů najdete v tématu Seznamy sloupců.
Poskytování úložiště pro nové sloupce
Dále nastavte umístění úložiště, aby se sloupce dynamicky svážely. Cílem je poskytnout prvek seznamu, do kterého se mají ukládat hodnoty jednotlivých sloupců. Tato umístění úložiště paralelně paralelně ukládají členské proměnné sady záznamů, které ukládají normálně vázané sloupce.
Poskytnutí dynamického úložiště pro nové sloupce (dynamické hodnoty sloupců)
Sestavte dynamické hodnoty sloupců, paralelně se sloupci a svázat dynamicky, aby obsahovaly hodnotu dat v každém sloupci.
Na obrázku je například dynamický sloupec (Seznam 4) s jedním prvkem:
CString
objekt obsahující skutečné telefonní číslo aktuálního záznamu: "555-1212".V nejběžnějším případě má dynamic-Column-Values prvky typu
CString
. Pokud pracujete se sloupci různých datových typů, potřebujete seznam, který může obsahovat prvky různých typů.
Výsledkem předchozích postupů jsou dva hlavní seznamy: Sloupce-to-Bind-Dynamicky obsahující názvy sloupců a hodnoty Dynamic-Column-Values obsahující hodnoty ve sloupcích aktuálního záznamu.
Tip
Pokud nové sloupce nejsou všechny stejné datové typy, můžete chtít další paralelní seznam obsahující položky, které nějakým způsobem definují typ každého odpovídajícího prvku v seznamu sloupců. (Pokud chcete, můžete k tomu použít hodnoty AFX_RFX_BOOL, AFX_RFX_BYTE atd.. Tyto konstanty jsou definovány v AFXDB.H.) Zvolte typ seznamu podle toho, jak představujete datové typy sloupců.
Přidání volání RFX pro vytvoření vazby sloupců
Nakonec uspořádejte dynamickou vazbu tak, že do funkce DoFieldExchange
umístíte volání RFX pro nové sloupce.
Dynamické přidávání volání RFX pro nové sloupce
- Do členské funkce vaší hlavní sady
DoFieldExchange
záznamů přidejte kód, který prochází seznamem nových sloupců (Columns-to-Bind-Dynamicky). V každé smyčce extrahujte název sloupce z sloupců na vazbu dynamicky a výslednou hodnotu sloupce z hodnoty Dynamic-Column-Values. Tyto položky předejte funkci RFX, která je vhodná pro datový typ sloupce. Popisy seznamů najdete v tématu Seznamy sloupců.
V běžném případě RFX_Text
funkce volá objekty extrahování CString
ze seznamů, stejně jako v následujících řádcích kódu, kde Columns-to-Bind-Dynamicly je CStringList
volána m_listName
a Dynamic-Column-Values je CStringList
volána m_listValue
:
RFX_Text( pFX,
m_listName.GetNext( posName ),
m_listValue.GetNext( posValue ));
Další informace o funkcích RFX naleznete v tématu Makra a globální hodnoty v referenční dokumentaci knihovny tříd.
Tip
Pokud jsou nové sloupce různé datové typy, použijte příkaz switch ve smyčce k volání příslušné funkce RFX pro každý typ.
DoFieldExchange
Když rozhraní volá během Open
procesu vytvoření vazby sloupců se sadou záznamů, volání RFX pro statické sloupce tyto sloupce sváže. Smyčka pak opakovaně volá funkce RFX pro dynamické sloupce.
Viz také
Sada záznamů (ODBC)
Sada záznamů: Práce s velkými datovými položkami (ODBC)