Sdílet prostřednictvím


Sada záznamů: Deklarování třídy pro předdefinovaný dotaz (ODBC)

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

Toto téma se vztahuje na třídy MFC ODBC.

Toto téma vysvětluje, jak vytvořit třídu sady záznamů pro předdefinovaný dotaz (někdy označovaný jako uložená procedura, například v Microsoft SQL Serveru).

Poznámka:

Toto téma se vztahuje na objekty odvozené z toho, ze CRecordset kterých hromadné načítání řádků nebylo implementováno. Pokud je implementováno hromadné načítání řádků, proces je velmi podobný. Informace o rozdílech mezi sadami záznamů, které implementují hromadné načítání řádků a těch, které nejsou, najdete v tématu Sada záznamů: Hromadné načítání záznamů (ODBC).

Některé systémy pro správu databází (DBMSs) umožňují vytvořit předdefinovaný dotaz a volat ho z vašich programů, jako je funkce. Dotaz má název, může přijímat parametry a může vracet záznamy. Postup v tomto tématu popisuje, jak volat předdefinovaný dotaz, který vrací záznamy (a možná přebírá parametry).

Databázové třídy nepodporují aktualizaci předdefinovaných dotazů. Rozdíl mezi předdefinovaným dotazem snímku a předdefinovaným dotazem dynaset není aktualizovatelnost, ale jestli jsou změny provedené jinými uživateli (nebo jinými sadami záznamů v programu) viditelné v sadě záznamů.

Tip

K volání předdefinovaného dotazu, který nevrací záznamy, nepotřebujete sadu záznamů. Připravte příkaz SQL, jak je popsáno níže, ale spusťte ho CDatabase voláním členské funkce ExecuteSQL.

Můžete vytvořit jednu třídu sady záznamů pro správu volání předdefinovaného dotazu, ale musíte udělat nějakou práci sami. Průvodci nepodporují vytváření třídy speciálně pro tento účel.

Vytvoření třídy pro volání předdefinovaného dotazu (uložená procedura)

  1. Pomocí Průvodce příjemcem ROZHRANÍ ODBC MFC z příkazu Přidat třídu vytvořte třídu sady záznamů pro tabulku, která přispívá nejvíce sloupců vrácených dotazem. To vám dává úvodní hlavu.

  2. Ručně přidejte datové členy polí pro všechny sloupce všech tabulek, které dotaz vrátí, ale průvodce pro vás nevytvořil.

    Pokud například dotaz vrátí tři sloupce z každé ze dvou dalších tabulek, přidejte do třídy šest datových členů polí (z příslušných datových typů).

  3. Ručně přidejte volání funkce RFX v členské funkci DoFieldExchange třídy, jedna odpovídající datovému typu každého přidaného datového členu pole.

    Immediately before these RFX calls, call <MSHelp:link keywords="_mfc_CFieldExchange.3a3a.SetFieldType" TABINDEX="0">SetFieldType</MSHelp:link>, as shown here:
    pFX->SetFieldType( CFieldExchange::outputColumn );
    

    Poznámka:

    Musíte znát datové typy a pořadí sloupců vrácených v sadě výsledků. Pořadí volání DoFieldExchange funkce RFX musí odpovídat pořadí sloupců sady výsledků.

  4. Ručně přidejte inicializace pro nové datové členy pole v konstruktoru tříd záznamů.

    Musíte také zvýšit inicializační hodnotu m_nFields datového členu . Průvodce zapíše inicializaci, ale pokrývá pouze datové členy pole, které za vás přidá. Příklad:

    m_nFields += 6;
    

    Některé datové typy by zde neměly být inicializovány, CLongBinary například nebo bajtová pole.

  5. Pokud dotaz přebírá parametry, přidejte datový člen parametru pro každý parametr, volání funkce RFX pro každý a inicializace pro každý.

  6. Pro každý přidaný parametr musíte zvýšit m_nParams , jak jste to udělali m_nFields pro přidaná pole v kroku 4 tohoto postupu. Další informace naleznete v tématu Sada záznamů: Parametrizace sady záznamů (ODBC).

  7. Ručně napište řetězec příkazu SQL s následujícím formulářem:

    {CALL proc-name [(? [, ?]...)]}
    

    where CALL je klíčové slovo ODBC, proc-name je název dotazu, jak je známo ve zdroji dat, a položky "?" jsou zástupné symboly pro hodnoty parametrů, které zadáte do sady záznamů za běhu (pokud existuje). Následující příklad připraví zástupný symbol pro jeden parametr:

    CString mySQL = "{CALL Delinquent_Accts (?)}";
    
  8. V kódu, který otevře sadu záznamů, nastavte hodnoty datových členů sady záznamů a potom volejte Open členskou funkci a předejte řetězec SQL pro parametr lpszSQL . Nebo místo toho nahraďte řetězec vrácený členovou GetDefaultSQL funkcí ve vaší třídě.

Následující příklady ukazují postup volání předdefinovaného dotazu s názvem Delinquent_Accts, který přebírá jeden parametr pro číslo prodejní oblasti. Tento dotaz vrátí tři sloupce: Acct_No, L_Name, Phone. Všechny sloupce jsou z tabulky Zákazníci.

Následující sada záznamů určuje datové členy polí pro sloupce, které dotaz vrátí, a parametr pro číslo prodejní oblasti požadované za běhu.

class CDelinquents : public CRecordset
{
// Field/Param Data
    LONG m_lAcct_No;
    CString m_strL_Name;
    CString m_strPhone;
    LONG m_lDistParam;
    // ...
};

Tato deklarace třídy je, jak ji průvodce zapíše, s výjimkou člena přidaného m_lDistParam ručně. Ostatní členové se tady nezobrazují.

Další příklad ukazuje inicializace datových členů v konstruktoru CDelinquents .

CDelinquents::CDelinquents(CDatabase* pdb)
   : CRecordset(pdb)
{
    // Wizard-generated params:
    m_lAcct_No = 0;
    m_strL_Name = "";
    m_strPhone = "";
    m_nFields = 3;
    // User-defined params:
    m_nParams = 1;
    m_lDistParam = 0;
}

Poznamenejte si inicializace pro m_nFields a m_nParams. Průvodce inicializuje m_nFields; inicializuje m_nParams.

Následující příklad ukazuje funkce RFX v CDelinquents::DoFieldExchange:

void CDelinquents::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, "Acct_No", m_lAcct_No);
    RFX_Text(pFX, "L_Name", m_strL_Name);
    RFX_Text(pFX, "Phone", m_strPhone);
    pFX->SetFieldType(CFieldExchange::param);
    RFX_Long(pFX, "Dist_No", m_lDistParam);
}

Kromě volání RFX pro tři vrácené sloupce tento kód spravuje vazbu parametru, který předáte za běhu. Parametr je klíč ke sloupci Dist_No (číslo oblasti).

Další příklad ukazuje, jak nastavit řetězec SQL a jak ho použít k otevření sady záznamů.

// Construct a CDelinquents recordset object
CDelinquents rsDel( NULL );
CString strSQL = "{CALL Delinquent_Accts (?)}"
// Specify a parameter value (obtained earlier from the user)
rsDel.m_lDistParam = lDistrict;
// Open the recordset and run the query
if( rsDel.Open( CRecordset::snapshot, strSQL ) )
    // Use the recordset ...

Tento kód vytvoří snímek, předá ho parametr získaný dříve od uživatele a zavolá předdefinovaný dotaz. Když se dotaz spustí, vrátí záznamy pro zadanou prodejní oblast. Každý záznam obsahuje sloupce pro číslo účtu, příjmení zákazníka a telefonní číslo zákazníka.

Tip

Možná budete chtít zpracovat návratovou hodnotu (výstupní parametr) z uložené procedury. Další informace a příklad naleznete v tématu CFieldExchange::SetFieldType.

Viz také

Sada záznamů (ODBC)
Sada záznamů: Opětovné spuštění dotazu na sadu záznamů (ODBC)
Sada záznamů: Deklarování třídy pro tabulku (ODBC)
Sada záznamů: Provedení spojení (rozhraní ODBC)