Sdílet prostřednictvím


Sada záznamů: Parametrizace sady záznamů (ODBC)

Toto téma platí pro třídy knihovny MFC rozhraní ODBC.

Někdy můžete chtít vybrat záznamy v době běhu pomocí informací, které jste vypočítali nebo získali od vašeho koncového uživatele.Parametry sady záznamů vám umožňují dosáhnout tohoto cíle.

Toto téma vysvětluje:

  • Účel parametrizované sady záznamů.

  • Kdy a proč je vhodné parametrizovat sadu záznamů.

  • Jak deklarovat datové členy parametru ve vaší třídě sady záznamů.

  • Jak předat informace parametru objektu sady záznamů v době běhu.

Parametrizované sady záznamů

Parametrizovaná sada záznamů umožňuje předat informace o parametrech v době běhu.To má dva důležité efekty:

  • Může to mít za následek vyšší rychlost provádění.

  • Umožňuje vytvořit dotaz za běhu, na základě informací, které jste neměli dostupné v době návrhu, jako jsou informace obdržené od uživatele nebo vypočtené v době běhu.

Když zavoláte Open pro spuštění dotazu, používá sada záznamů informace o parametrech k dokončení jejího příkazu SQL SELECT.Můžete parametrizovat všechny sady záznamů.

Kdy použít parametry

Mezi typická použití parametrů patří:

  • Předávání argumentů za běhu předdefinovanému dotazu.

    Pro předání parametrů uložené proceduře musíte určit kompletní vlastní příkaz ODBC CALL – se zástupnými symboly parametrů – když zavoláte Open, přepisující výchozí příkaz SQL sady záznamů.Další informace naleznete v tématu CRecordset::Open v Knihovny tříd a SQL: příkazu SQL přizpůsobení sady záznamů (ODBC) a Sada 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ž váš koncový uživatel vyhledává informace pro konkrétního studenta v databázi registrací studentů, můžete zadat jméno studenta nebo ID jako parametr získaný od uživatele.Potom při volání členské funkce Requery vaší sady záznamů vybere dotaz pouze záznam tohoto studenta.

    Řetězec filtru vaší sady záznamů, uložený v m_strFilter, může vypadat například takto:

    "StudentID = ?"
    

    Předpokládejme, že obdržíte ID studenta v proměnné strInputID.Když nastavíte parametr na strInputID (například ID studenta 100), je hodnota proměnné svázána se zástupným symbolem parametru, reprezentovaným "?" v řetězci filtru.

    Přiřaďte hodnotu parametru takto:

    strInputID = "100";
    ...
    m_strParam = strInputID;
    

    Neměli byste chtít nastavit řetězec filtru tímto způsobem:

    m_strFilter = "StudentID = 100";   // 100 is incorrectly quoted
                                       // for some drivers
    

    Pro diskusi o správném použití uvozovek v řetězcích filtru, viz sady záznamů: filtrování záznamů (ODBC).

    Hodnota parametru je různá pokaždé, když se znovu spustí dotaz sady záznamů pro nové ID studenta.

    Tip

    Použití parametru je efektivnější než jednoduchý filtr.Pro parametrizovanou sadu záznamů musí databáze zpracovat příkaz SQL SELECT pouze jednou.Pro filtrovanou sadu záznamů bez parametrů musí být příkaz SELECT zpracován pokaždé, když provedete Requery s novou hodnotou filtru.

Další informace o filtrech naleznete v tématu sady záznamů: filtrování záznamů (ODBC).

Parametrizace vaší třídy sady záznamů

[!POZNÁMKA]

Tento oddíl se týká objektů odvozených ze třídy CRecordset, ve které nebylo naimplementováno hromadné načítání řádků.Pokud používáte hromadné načítání řádků, implementace parametrů je podobný proces.Další informace naleznete v tématu sady záznamů: Fetching Records in Bulk (ODBC).

Před vytvořením vaší třídy sady záznamů určete, jaké parametry potřebujete, jaké jsou jejich datové typy a jak je sada záznamů použije.

Pro parametrizování třídy sady záznamů

  1. Spusťte Průvodce příjemce knihovny MFC rozhraní ODBC z Přidat třídu pro vytvoření třídy.

  2. Určete datové členy pole pro sloupce sady záznamů.

  3. Poté co průvodce zapíše třídu do souboru ve vašem projektu, přejděte na soubor .h a ručně přidejte jeden nebo více datových členů parametrů k deklaraci třídy.Přidání může vypadat podobně jako v následujícím příkladu části třídy snímku, určené k zodpovězení dotazu "Kteří studenti jsou ve třídě pokročilých?"

    class CStudentSet : public CRecordset
    {
    // Field/Param Data
        CString m_strFirstName;
        CString m_strLastName;
        CString m_strStudentID;
        CString m_strGradYear;
    
        CString m_strGradYrParam;
    };
    

    Přidejte vaše datové členy parametrů za datové členy pole generované průvodcem.Úmluva doporučuje připojit slovo "Param" ke každému názvu parametru definovanému uživatelem.

  4. Upravte členskou funkci 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í vašich funkcí RFX naleznete v tématu Výměna pole záznamu: Jak funguje RFX.Předcházejte voláním RFX pro parametry jediným voláním na:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. V konstruktoru vaší třídy sady záznamů zvyšte počet parametrů m_nParams.

    Informace naleznete v tématu Výměna pole záznamu: práce s kódem průvodce.

  6. Když napíšete kód, který vytvoří objekt sady záznamů této třídy, umístěte symbol "?" (otazník) na každé místo vašich řetězců příkazů SQL, kde se má nahradit parametr.

    V době běhu jsou zástupné symboly "?" vyplněny v pořadí, ve kterém předáte hodnoty parametru.První nastavení datového členu 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 funkce musí odpovídat pořadí zástupných symbolů parametrů ve vašem řetězci SQL.

Tip

Nejpravděpodobnější řetězec se kterým pracovat je řetězec, který zadáte (pokud zadáte) pro datový člen m_strFilter dané třídy, ale některé ovladače rozhraní ODBC mohou povolit parametry v jiných klauzulích SQL.

Předávání hodnot parametrů v době běhu

Musíte určit hodnoty parametrů před voláním Open (pro nový objekt sady záznamů) nebo Requery (pro již existující).

Pro předání hodnot parametrů objektu sady záznamů za běhu

  1. Vytvořte objekt sady záznamů.

  2. Připravte řetězec nebo řetězce, jako je řetězec m_strFilter, obsahující příkaz SQL nebo jeho části.Umístěte zástupné symboly "?" tam, kam mají přijít informace o parametrech.

  3. Přiřaďte hodnotu parametru za běhu každému datovému členu parametru objektu.

  4. Zavolejte členskou funkci Open (nebo Requery pro existující sadu záznamů).

Předpokládejme například, že chcete zadat řetězec filtru pro vaši sadu záznamů pomocí informací, získaných za běhu.Předpokládejme, že jste dříve vytvořili sadu záznamů třídy CStudentSet – s názvem rsStudent – a nyní chcete znovu spustit dotaz pro konkrétní druh informace 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 ty studenty, jejichž záznamy vyhovují podmínkám určeným filtrem, který byl vytvořen z parametrů za běhu.V tomto případě sada záznamů obsahuje záznamy všech pokročilých studentů.

[!POZNÁMKA]

V případě potřeby můžete nastavit hodnotu datového členu parametru na Null pomocí SetParamNull.Podobně můžete zkontrolovat, zda je datový člen parametru Null pomocí IsFieldNull.

Viz také

Koncepty

Sada záznamů (ODBC)

Seznam 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)