Sada záznamů: Dynamické propojení 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é od CRecordset, u kterých nebylo implementováno hromadné načítání řádků. Techniky popsané výše obecně se nedoporučují, 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 MFC ODBC není k dispozici ve Visual Studio 2019 a novějších verzích. Stále můžete vytvořit zákazníka ručně.

V době návrhu průvodce aplikací MFC nebo Průvodce pro příjemce MFC ODBC (z Přidat třídu) vytvoří třídy sady záznamů na základě známých tabulek a sloupců 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 referenční příručce ODBC pro programátory.

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:

  1. 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.

  2. Proveďte kroky pro dynamické přidávání sloupců.

    Podívejte se na postup popsaný v části Přidání sloupců níže.

  3. 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é propojení přidaných sloupců za běhu vyžaduje následující kroky:

  1. 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).

  2. Poskytněte úložiště pro nové členy datového 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ázat
    Vytváření seznamů sloupců, které se mají dynamicky svázat

  3. Přidejte volání funkce RFX do funkce hlavní sady záznamů DoFieldExchange pro každý přidaný sloupec. Tato volání funkcí RFX provádějí získávání záznamu, včetně dalších sloupců, a připojení sloupců k datovým členům sady záznamů nebo k dynamicky poskytnuté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 aktuální tabulky (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é sloupce sady záznamů (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.
Dynamicky se napojí/sloučí sloupce (Seznam 3 na obrázku) Seznam sloupců v tabulce, ale ne ve vaší 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 ve sloupcích k dynamickému propojení v poměru 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:

Určení sloupců tabulky, které nejsou v sadě záznamů

Vytvořte seznam (bound-Recordset-Columns, jako v Seznamu 2 na obrázku), který obsahuje seznam sloupců již svázaných ve vaší hlavní sadě záznamů. Poté sestavte seznam (sloupce pro dynamické přiřazení, odvozené ze sloupců Current-Table-Columns a Bound-Recordset-Columns), který obsahuje názvy sloupců, které jsou v tabulce ve zdroji dat, ale ne v hlavní sadě záznamů.

Určit názvy sloupců, které nejsou v sadě záznamů (dynamicky svázané sloupce)
  1. Vytvořte seznam (Bound-Recordset-Columns) sloupců, které jsou již vázané v hlavní sadě záznamů.

    Jedním z přístupů je vytvořit Bound-Recordset-Columns již v době návrhu. Můžete si vizuálně prohlédnout volání funkce RFX ve funkci DoFieldExchange sady záznamů, abyste zjistili 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. Sloupec Phone chybí ve sloupcích Bound-Recordset-Columns uvedených v Current-Table-Columns (Seznam 1).

  2. Porovnejte sloupce Current-Table-Columns a Bound-Recordset-Columns a vytvořte seznam (Sloupce k dynamickému přiřazení) 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 Columns-to-Bind-Dynamically vložte jakákoli jména ze sloupců Current-Table-Columns, která se neobjevují ve sloupcích Bound-Recordset-Columns.

    Na obrázku je například sloupec Sloupce k dynamickému svázání (Seznam 3) s jedním prvkem: sloupec Phone nalezený v Current-Table-Columns (List 1), ale ne v Bound-Recordset-Columns (List 2).

  3. 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é mají být dynamicky svázány (sloupce k dynamickému svázání).

    Prvky tohoto seznamu hrají roli nových datových členů sady záznamů. Jedná se o umístění úložišť, k nimž jsou vázány dynamické sloupce. Popisy seznamů najdete v tématu Seznamy sloupců.

Poskytování úložiště pro nové sloupce

Dále nastavte prostory pro úložiště, aby byly sloupce dynamicky spojeny. Cílem je poskytnout prvek seznamu, do kterého se mají ukládat hodnoty jednotlivých sloupců. Tato úložná místa odpovídají členským proměnným sady záznamů, které ukládají běžně přiřazené sloupce.

Poskytnutí dynamického úložiště pro nové sloupce (dynamické hodnoty sloupců)

  1. Sestavte strukturu nazvanou Dynamické-Hodnoty-Sloupců, paralelně se strukturou Sloupce-Které-Se-Mají-Svázat-Dynamicky, aby obsahovaly hodnoty dat v každém sloupci.

    Na obrázku jsou například dynamické hodnoty sloupců (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-k-dynamickému-přiřazení, který obsahuje názvy sloupců, a Dynamické-hodnoty-ve-sloupcích, které obsahují hodnoty aktuálního záznamu.

Návod

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
  1. 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 ze sloupců k dynamickému svázání a výslednou hodnotu pro sloupec z dynamických hodnot sloupců. 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ě ve voláních vaší funkce RFX_Text extrahujete objekty CString ze seznamů, stejně jako v následujících řádcích kódu, kde Columns-to-Bind-Dynamically je CStringList zvaný m_listName a Dynamic-Column-Values je CStringList zvaný m_listValue:

RFX_Text( pFX,
            m_listName.GetNext( posName ),
            m_listValue.GetNext( posValue ));

Další informace o funkcích RFX naleznete v části Makra a globální hodnoty v Referenční příručce ke knihovně tříd.

Návod

Pokud jsou nové sloupce různého datového typu, použijte ve smyčce příkaz přepínače 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)
Záznamová sada: Práce s velkými datovými prvky (ODBC)