Zestaw rekordów: deklarowanie klasy dla wstępnie zdefiniowanego zapytania (ODBC)
Uwaga
Kreator klienta MFC ODBC nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach. Nadal można ręcznie utworzyć użytkownika.
Ten temat dotyczy klas MFC ODBC.
W tym temacie opisano sposób tworzenia klasy zestawu rekordów dla wstępnie zdefiniowanego zapytania (czasami nazywanej procedurą składowaną, jak w programie Microsoft SQL Server).
Uwaga
Ten temat dotyczy obiektów pochodnych, CRecordset
z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli pobieranie wierszy zbiorczych jest implementowane, proces jest bardzo podobny. Aby zrozumieć różnice między zestawami rekordów, które implementują pobieranie wierszy zbiorczych i te, które nie są, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).
Niektóre systemy zarządzania bazami danych (DBMS) umożliwiają utworzenie wstępnie zdefiniowanego zapytania i wywołanie go z programów, takich jak funkcja. Zapytanie ma nazwę, może przyjmować parametry i może zwracać rekordy. Procedura w tym temacie opisuje sposób wywoływania wstępnie zdefiniowanego zapytania zwracającego rekordy (i być może przyjmuje parametry).
Klasy baz danych nie obsługują aktualizowania wstępnie zdefiniowanych zapytań. Różnica między wstępnie zdefiniowanym zapytaniem migawki a wstępnie zdefiniowanym zapytaniem dynaset nie jest aktualizowana, ale czy zmiany wprowadzone przez innych użytkowników (lub innych zestawów rekordów w programie) są widoczne w zestawie rekordów.
Napiwek
Zestaw rekordów nie jest potrzebny do wywoływania wstępnie zdefiniowanego zapytania, które nie zwraca rekordów. Przygotuj instrukcję SQL zgodnie z poniższym opisem, ale wykonaj ją, wywołując funkcję składową CDatabase
ExecuteSQL.
Możesz utworzyć pojedynczą klasę zestawu rekordów, aby zarządzać wywoływaniem wstępnie zdefiniowanego zapytania, ale musisz wykonać część pracy samodzielnie. Kreatory nie obsługują tworzenia klasy specjalnie w tym celu.
Aby utworzyć klasę do wywoływania wstępnie zdefiniowanego zapytania (procedura składowana)
Użyj Kreatora konsumenta MFC ODBC z dodaj klasę, aby utworzyć klasę zestawu rekordów dla tabeli, która współtworzy większość kolumn zwracanych przez zapytanie. Daje to początek głowy.
Ręcznie dodaj elementy członkowskie danych pól dla dowolnych kolumn tabel zwracanych przez zapytanie, ale kreator nie utworzył dla Ciebie.
Jeśli na przykład zapytanie zwraca trzy kolumny z dwóch dodatkowych tabel, dodaj do klasy sześć składowych danych pól (odpowiednich typów danych).
Ręcznie dodaj wywołania funkcji RFX w funkcji składowej DoFieldExchange klasy, która odpowiada typowi danych każdego dodanego elementu członkowskiego danych pola.
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 );
Uwaga
Musisz znać typy danych i kolejność kolumn zwracanych w zestawie wyników. Kolejność wywołań funkcji RFX w
DoFieldExchange
pliku musi być zgodna z kolejnością kolumn zestawu wyników.Ręcznie dodaj inicjacje dla nowych składowych danych pól w konstruktorze klasy zestawu rekordów.
Należy również zwiększać wartość inicjowania elementu członkowskiego danych m_nFields . Kreator zapisuje inicjację, ale obejmuje tylko elementy członkowskie danych pól, które doda do Ciebie. Na przykład:
m_nFields += 6;
Niektóre typy danych nie powinny być inicjowane w tym miejscu, na przykład
CLongBinary
lub tablice bajtów.Jeśli zapytanie przyjmuje parametry, dodaj element członkowski danych parametrów dla każdego parametru, wywołanie funkcji RFX dla każdego z nich i inicjację dla każdego z nich.
Należy zwiększać
m_nParams
dla każdego dodanego parametru, tak jakm_nFields
w przypadku dodanych pól w kroku 4 tej procedury. Aby uzyskać więcej informacji, zobacz Zestaw rekordów: parametryzacja zestawu rekordów (ODBC).Ręcznie napisz ciąg instrukcji SQL z następującym formularzem:
{CALL proc-name [(? [, ?]...)]}
gdzie CALL jest słowem kluczowym ODBC, proc-name jest nazwą zapytania, ponieważ jest znana w źródle danych, a elementy "?" są symbolami zastępczymi wartości parametrów podanych w zestawie rekordów w czasie wykonywania (jeśli istnieje). Poniższy przykład przygotowuje symbol zastępczy dla jednego parametru:
CString mySQL = "{CALL Delinquent_Accts (?)}";
W kodzie, który otwiera zestaw rekordów, ustaw wartości składowych danych parametrów zestawu rekordów, a następnie wywołaj
Open
funkcję składową, przekazując ciąg SQL dla parametru lpszSQL . Zamiast tego zastąp ciąg zwracany przez funkcję składowąGetDefaultSQL
w klasie.
W poniższych przykładach przedstawiono procedurę wywoływania wstępnie zdefiniowanego zapytania o nazwie Delinquent_Accts
, która przyjmuje jeden parametr dla numeru okręgu sprzedaży. To zapytanie zwraca trzy kolumny: Acct_No
, , L_Name
Phone
. Wszystkie kolumny pochodzą z tabeli Customers.
Poniższy zestaw rekordów określa składowe danych pól dla kolumn zwracanych przez zapytanie oraz parametr numeru okręgu sprzedaży żądanego w czasie wykonywania.
class CDelinquents : public CRecordset
{
// Field/Param Data
LONG m_lAcct_No;
CString m_strL_Name;
CString m_strPhone;
LONG m_lDistParam;
// ...
};
Ta deklaracja klasy jest taka, jak pisze kreator, z wyjątkiem elementu członkowskiego dodanego m_lDistParam
ręcznie. Inne elementy członkowskie nie są tutaj wyświetlane.
W następnym przykładzie przedstawiono inicjowanie elementów członkowskich danych w konstruktorze 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;
}
Zanotuj inicjowanie m_nFields i m_nParams. Kreator inicjuje m_nFields
element ; zainicjujesz m_nParams
element .
W następnym przykładzie przedstawiono funkcje RFX w programie 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);
}
Oprócz wykonywania wywołań RFX dla trzech zwracanych kolumn ten kod zarządza powiązaniem parametru przekazywanego w czasie wykonywania. Parametr jest kluczem do kolumny (numer okręgowy Dist_No
).
W następnym przykładzie pokazano, jak skonfigurować ciąg SQL i jak używać go do otwierania zestawu rekordów.
// 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 ...
Ten kod tworzy migawkę, przekazuje do niego parametr uzyskany wcześniej od użytkownika i wywołuje wstępnie zdefiniowane zapytanie. Gdy zapytanie zostanie uruchomione, zwraca rekordy dla określonej dzielnicy sprzedaży. Każdy rekord zawiera kolumny dla numeru konta, nazwiska klienta i numeru telefonu klienta.
Napiwek
Możesz chcieć obsłużyć wartość zwracaną (parametr wyjściowy) z procedury składowanej. Aby uzyskać więcej informacji i przykład, zobacz CFieldExchange::SetFieldType.
Zobacz też
Zestaw rekordów (ODBC)
Zestaw rekordów: ponowne wysyłanie zapytania do zestawu rekordów (ODBC)
Zestaw rekordów: deklarowanie klasy dla tabeli (ODBC)
Zestaw rekordów: wykonywanie sprzężenia (ODBC)