Sada záznamů: Deklarování třídy pro předdefinovaný dotaz (ODBC)
Toto téma platí pro třídy knihovny MFC rozhraní ODBC.
Toto téma vysvětluje, jak vytvořit třídu sady záznamů pro předdefinovaný dotaz (někdy nazývaný také uložená procedura, jako v Microsoft SQL Server).
[!POZNÁMKA]
Toto téma se týká objektů odvozených z třídy CRecordset, ve které nebylo naimplementováno hromadné načítání řádku. Pokud je naimplementováno hromadné načítání řádku, je proces velmi podobný.Chcete-li porozumět rozdílům mezu sadami záznamů, které implementují hromadné načítání řádku a nejsou, viz sady záznamů: Fetching Records in Bulk (ODBC).
Některé databázové systémy (systémy DBMS) umožňují vytvořit předdefinovaný dotaz a zavolat ho z Vašich programů jako funkci.Dotaz má název, může přebírat parametry a může vrátit záznamy.Procedura, uvedená v tomto tématu, popisuje jak volat předdefinovaný dotaz, který vrací záznamy (a třeba přebírá parametry).
Třídy databází nepodporují aktualizaci předdefinovaných dotazů.Rozdíl mezi snímkem předdefinovaného dotazu a dynamickou sadou předdefinovaného dotazu není aktualizovatelný, ale veškeré změny uvedené jinými uživateli (nebo jinými sadami záznamů ve vašem programu) jsou viditelné ve vaší sadě záznamů.
Tip
Nepotřebujete sadu záznamů pro volání předdefinovaného dotazu, který nevrací žádné záznamy.Připravte si SQL dotaz, jak je popsáno níže, ale proveďte ho voláním CDatabase členské funkce ExecuteSQL.
Můžete vytvořit jednoduchou třídu sady záznamů ke správě volání předdefinovaného dotazu, musíte však provádět některé úkoly sami.Průvodci nepodporují vytváření specifické třídy pro tento účel.
Chcete-li vytvořit třídu pro volání předdefinovaného dotazu (uložené procedury)
Použijte Průvodce příjemce knihovny MFC rozhraní ODBC z nabídky Přidat třídu k vytvoření třídy sady záznamů pro tabulku, která přispívá nejvíce sloupci, vrácenými dotazem.To Vám dává počátek hlavy.
Přidejte ručně pole datových členů pro všechny sloupce ze všech tabulek, které vrátí dotaz, ale které pro Vás nevytvořil průvodce.
Například pokud vrátí dotaz tři sloupce, každý ze dvou dalších tabulek, přidá do třídy šest polí datových členů (příslušných datových typů).
Přidejte ručně volání funkce RFX ve členské funkci DoFieldExchange třídy jeden odpovídající datový typ každého přidaného pole datového člena.
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í vrácených sloupců v sadě výsledků dotazu.Pořadí volání RFX funkce v DoFieldExchange musí odpovídat pořadí sloupců sady výsledků dotazu.
Přidejte ručně inicializace pro nové pole datových členů v konstruktoru třídy sady záznamů.
Musíte také zvýšit inicializační hodnotu pro datový člen m_nFields.Průvodce zapíše inicializaci, ale zahrne pouze datových členů polí, které pro vás přidává.Příklad:
m_nFields += 6;
Některé datové typy by zde neměly být inicializovány, například CLongBinary nebo pole bajtů.
Pokud dotaz přebírá parametry, přidejte parametr datového člena pro každý parametr pro každý, který volá funkci RFX a pro každý inicializovaný.
Bude třeba zvýšit m_nParams pro každý přidaný parametr, stejně jako m_nFields pro přidaná pole v kroku 4 této procedury.Další informace naleznete v tématu Sada záznamů: parametrizování sada záznamů (rozhraní ODBC).
Zapište ručně řetězec SQL dotazu s následujícím formulářem:
{CALL proc-name [(? [, ?]...)]}
kde CALL je klíčové slovo rozhraní ODBC, proc-name je název dotazu, jako je znám ve zdroji dat a "?" položky jsou zástupné symboly pro hodnoty parametru, které zadáte sadě záznamu v době spuštění (pokud existuje).Následující příklad připraví zástupný symbol pro jeden parametr:
CString mySQL = "{CALL Delinquent_Accts (?)}";
V kódu, který otevře sadu záznamů, nastavte hodnoty parametru datových členů sady záznamů a poté zavolejte členskou funkci Open, předáním Vašeho řetězce SQL pro parametr lpszSQL.Nebo místo toho nahraďte řetězec vrácený členskou funkcí GetDefaultSQL ve Vaší třídě.
Následující příklady ukazují proceduru pro volání předdefinovaného dotazu, s názvem Delinquent_Accts, která přijímá jeden parametr pro číslo oblasti prodeje. Tento dotaz vrátí tři sloupce: Acct_No, L_Name, Phone.Všechny sloupce jsou z tabulky Customers.
Následující sada záznamů určuje pole datových členů pro sloupce, které vrátí dotaz a parametr pro číslo oblasti prodeje, 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 taková, jak jí zapíše průvodce, s výjimkou pro člena m_lDistParam, přidaného ručně. Ostatní členové zde nejsou zobrazeni.
Následující příklad ukazuje inicializaci pro datové členy 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;
}
Všimněte si inicializací pro m_nFields a m_nParams.Průvodce inicializuje m_nFields; Vy inicializujete 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ě vytvoření volání RFX pro tři vrácené sloupce, spravuje tento kód vazbu parametru, který předáte za běhu.Parametr je nastaven na sloupec Dist_No (číslo oblasti).
Následující 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á mu parametr, který byl získaný dříve od uživatele a zavolá předdefinovaný dotaz.Při spuštění dotazu, vrátí záznamy pro zadanou oblast prodeje.Každý záznam obsahuje sloupce pro číslo účtu, příjmení zákazníka a telefonní číslo zákazníka.
Tip
Můžete chtít zpracovat vrácenou hodnota (výstupní parametr) z uložené procedury.Další informace a příklad naleznete v tématu CFieldExchange::SetFieldType.
Viz také
Koncepty
Sada záznamů: Opětovné spuštění dotazu na sadu záznamů (ODBC)