Sada záznamů: Parametrizace sady záznamů (ODBC)
Toto téma se vztahuje na třídy MFC ODBC.
Někdy můžete chtít vybrat záznamy za běhu pomocí informací, které jste vypočítali nebo získali od koncového uživatele. Parametry sady záznamů umožňují dosáhnout tohoto cíle.
Toto téma vysvětluje:
Účel parametrizované sady záznamů.
Jak deklarovat datové členy parametrů ve vaší třídě sady záznamů.
Jak předat informace o parametru objektu sady záznamů za běhu.
Parametrizované sady záznamů
Parametrizovaná sada záznamů umožňuje předávat informace o parametrech za běhu. To má dva cenné účinky:
Výsledkem může být lepší rychlost provádění.
Umožňuje vytvořit dotaz za běhu na základě informací, které nejsou k dispozici v době návrhu, například informace získané od uživatele nebo vypočítané za běhu.
Když zavoláte Open
ke spuštění dotazu, sada záznamů použije informace o parametrech k dokončení příkazu SQL SELECT . Parametrizovat můžete libovolnou sadu záznamů.
Kdy použít parametry
Mezi typické použití parametrů patří:
Předávání argumentů za běhu předdefinovanému dotazu
Pokud chcete předat parametry uložené proceduře, je nutné zadat úplný vlastní příkaz ODBC CALL – se zástupnými symboly parametrů – při volání
Open
, přepsání výchozího příkazu SQL sady záznamů. Další informace naleznete v tématu CRecordset::Open v referenčních informacích knihovny tříd a SQL: Přizpůsobení příkazu SQL sady záznamů (ODBC) a sady záznamů: Deklarování třídy pro předdefinovaný dotaz (ODBC).Efektivní provádění mnoha opakovaných dotazů s různými informacemi o parametrech
Například pokaždé, když koncový uživatel vyhledá informace pro konkrétního studenta v databázi registrace studenta, můžete zadat jméno nebo ID studenta jako parametr získaný od uživatele. Když pak zavoláte členskou
Requery
funkci sady záznamů, dotaz vybere jenom záznam daného studenta.Řetězec filtru sady záznamů uložený v
m_strFilter
sadě záznamů může vypadat takto:"StudentID = ?"
Předpokládejme, že v proměnné získáte ID studenta
strInputID
. Když nastavíte parametr nastrInputID
hodnotu (například ID studenta 100), je hodnota proměnné vázána na zástupný symbol parametru reprezentovaný znakem "?" v řetězci filtru.Přiřaďte hodnotu parametru následujícím způsobem:
strInputID = "100"; ... m_strParam = strInputID;
Řetězec filtru byste nechtěli nastavit tímto způsobem:
m_strFilter = "StudentID = 100"; // 100 is incorrectly quoted // for some drivers
Diskuzi o tom, jak správně používat uvozovky pro filtrovací řetězce, najdete v tématu Sada záznamů: Filtrování záznamů (ODBC).
Hodnota parametru se při každém opětovném dotazování sady záznamů pro nové ID studenta liší.
Tip
Použití parametru je efektivnější než jenom filtr. Pro parametrizovanou sadu záznamů musí databáze zpracovat příkaz SQL SELECT pouze jednou. U filtrované sady záznamů bez parametrů musí být příkaz SELECT zpracován pokaždé, když použijete
Requery
novou hodnotu filtru.
Další informace o filtrech naleznete v tématu Sada záznamů: Filtrování záznamů (ODBC).
Parametrizace třídy sady záznamů
Poznámka:
Tato část se vztahuje na objekty odvozené z toho, ze CRecordset
kterých hromadné načítání řádků nebylo implementováno. Pokud používáte hromadné načítání řádků, implementace parametrů je podobný proces. Další informace naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Než vytvoříte třídu sady záznamů, určete, jaké parametry potřebujete, jaké jsou jejich datové typy a jak je sada záznamů používá.
Parametrizace třídy sady záznamů
Poznámka:
Průvodce příjemcem rozhraní ODBC MFC není v sadě Visual Studio 2019 a novější k dispozici. Tuto funkci můžete přesto vytvořit ručně.
Spuštěním Průvodce příjemcem ROZHRANÍ ODBC MFC z příkazu Přidat třídu vytvořte třídu.
Zadejte datové členy polí pro sloupce sady záznamů.
Jakmile průvodce zapíše třídu do souboru v projektu, přejděte do souboru .h a ručně přidejte do deklarace třídy jeden nebo více datových členů parametrů. Přidání může vypadat podobně jako v následujícím příkladu, což je část třídy snímků navržená tak, aby odpověděla na dotaz "Kteří studenti jsou v vyšší třídě?"
class CStudentSet : public CRecordset { // Field/Param Data CString m_strFirstName; CString m_strLastName; CString m_strStudentID; CString m_strGradYear; CString m_strGradYrParam; };
Přidejte datové členy parametrů za datové členy pole vygenerované průvodcem. Konvence spočívá v připojení slova "Param" ke každému uživatelsky definovanému názvu parametru.
Upravte definici členské funkce DoFieldExchange v souboru .cpp. Přidejte volání funkce RFX pro každý datový člen parametru, který jste přidali do třídy. Informace o psaní funkcí RFX naleznete v tématu Výměna polí záznamu: Jak RFX funguje. Před voláním RFX parametrů vytvořte jedno volání:
pFX->SetFieldType( CFieldExchange::param ); // RFX calls for parameter data members
V konstruktoru třídy sady záznamů zvýší počet parametrů
m_nParams
.Informace naleznete v tématu Výměna polí záznamu: Práce s kódem průvodce.
Když napíšete kód, který vytvoří objekt sady záznamů této třídy, umístěte znak "?" (otazník) symbol na každém místě v řetězcích příkazu SQL, kde se má parametr nahradit.
V době běhu se zástupné symboly "?" vyplní v pořadí hodnotami parametrů, které předáte. První sada datových členů parametru po volání SetFieldType nahradí první "?" v řetězci SQL, druhý datový člen parametru nahradí druhý "?", atd.
Poznámka:
Pořadí parametrů je důležité: pořadí volání RFX pro parametry ve vaší DoFieldExchange
funkci musí odpovídat pořadí zástupných symbolů parametrů v řetězci SQL.
Tip
Nejpravděpodobnějším řetězcem, se kterým pracujete, je řetězec, který zadáte (pokud existuje) pro datový člen třídy m_strFilter , ale některé ovladače ODBC můžou povolit parametry v jiných klauzulích SQL.
Předávání hodnot parametrů za běhu
Před voláním Open
(pro nový objekt sady záznamů) nebo Requery
(pro existující objekt) je nutné zadat hodnoty parametrů.
Předání hodnot parametrů do objektu sady záznamů za běhu
Vytvořte objekt sady záznamů.
Připravte řetězec nebo řetězce, například
m_strFilter
řetězec, který obsahuje příkaz SQL nebo jeho části. Umístěte zástupné symboly "?" na místo, kam se mají informace o parametrech přejít.Každému datovému členu objektu přiřaďte hodnotu parametru za běhu.
Open
Volání členské funkce (neboRequery
, pro existující sadu záznamů).
Předpokládejme například, že chcete zadat řetězec filtru sady záznamů pomocí informací získaných za běhu. Předpokládejme, že jste vytvořili sadu záznamů třídy CStudentSet
, která byla dříve volána rsStudents
, a teď ji chcete znovu použít pro konkrétní druh informací o studentech.
// 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;
Sada záznamů obsahuje záznamy pro studenty, jejichž záznamy splňují podmínky zadané filtrem, které byly sestaveny z parametrů za běhu. V tomto případě sada záznamů obsahuje záznamy pro všechny starší studenty.
Poznámka:
V případě potřeby můžete nastavit hodnotu datového členu parametru na Hodnotu Null pomocí SetParamNull. Stejně tak můžete zkontrolovat, jestli je datový člen parametru Null, pomocí IsFieldNull.
Viz také
Sada záznamů (ODBC)
Sada záznamů: Přidávání, aktualizace a odstranění záznamů (ODBC)
Sada záznamů: Jak sady záznamů vybírají záznamy (ODBC)