Zestaw rekordów: parametryzacja zestawu rekordów (ODBC)

Ten temat dotyczy klas MFC ODBC.

Czasami możesz wybrać rekordy w czasie wykonywania przy użyciu informacji obliczonych lub uzyskanych od użytkownika końcowego. Parametry zestawu rekordów umożliwiają osiągnięcie tego celu.

W tym temacie opisano:

Sparametryzowane zestawy rekordów

Sparametryzowany zestaw rekordów umożliwia przekazywanie informacji o parametrach w czasie wykonywania. Ma to dwa cenne efekty:

  • Może to spowodować lepszą szybkość wykonywania.

  • Umożliwia tworzenie zapytania w czasie wykonywania na podstawie informacji niedostępnych w czasie projektowania, takich jak informacje uzyskane od użytkownika lub obliczane w czasie wykonywania.

Podczas wywoływania Open w celu uruchomienia zapytania zestaw rekordów używa informacji o parametrach do ukończenia instrukcji SQL SELECT . Można sparametryzować dowolny zestaw rekordów.

Kiedy należy używać parametrów

Typowe zastosowania parametrów to:

  • Przekazywanie argumentów czasu wykonywania do wstępnie zdefiniowanego zapytania.

    Aby przekazać parametry do procedury składowanej, należy określić pełną niestandardową instrukcję ODBC CALL — z symbolami zastępczymi parametrów — podczas wywoływania Openpolecenia zastąpić domyślną instrukcję SQL zestawu rekordów. Aby uzyskać więcej informacji, zobacz CRecordset::Open w dokumentacji biblioteki klas i SQL: dostosowywanie instrukcji SQL zestawu rekordów (ODBC) i zestaw rekordów: deklarowanie klasy dla wstępnie zdefiniowanego zapytania (ODBC).

  • Wydajne wykonywanie wielu ponownych zapytań przy użyciu różnych informacji o parametrach.

    Na przykład za każdym razem, gdy użytkownik końcowy wyszukuje informacje dla określonego ucznia w bazie danych rejestracji uczniów, możesz określić nazwę lub identyfikator ucznia jako parametr uzyskany od użytkownika. Następnie po wywołaniu funkcji składowej Requery zestawu rekordów zapytanie wybiera tylko ten rekord ucznia.

    Ciąg filtru zestawu rekordów przechowywany w elemecie m_strFiltermoże wyglądać następująco:

    "StudentID = ?"
    

    Załóżmy, że uzyskasz identyfikator ucznia w zmiennej strInputID. Po ustawieniu parametru na strInputID (na przykład identyfikator ucznia 100) wartość zmiennej jest powiązana z symbolem zastępczym parametru reprezentowanym przez znak "?" w ciągu filtru.

    Przypisz wartość parametru w następujący sposób:

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

    Nie chcesz konfigurować ciągu filtru w następujący sposób:

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

    Aby zapoznać się z omówieniem prawidłowego używania cudzysłowów dla ciągów filtrów, zobacz Zestaw rekordów: filtrowanie rekordów (ODBC).

    Wartość parametru jest inna za każdym razem, gdy ponownie zapisujesz zestaw rekordów dla nowego identyfikatora ucznia.

    Napiwek

    Użycie parametru jest bardziej wydajne niż tylko filtr. W przypadku sparametryzowanego zestawu rekordów baza danych musi przetwarzać instrukcję SQL SELECT tylko raz. W przypadku filtrowanego zestawu rekordów bez parametrów instrukcja SELECT musi być przetwarzana za każdym razem, gdy Requery zostanie utworzona nowa wartość filtru.

Aby uzyskać więcej informacji na temat filtrów, zobacz Zestaw rekordów: filtrowanie rekordów (ODBC).

Parametryzacja klasy zestawu rekordów

Uwaga

Ta sekcja dotyczy obiektów pochodnych CRecordset , z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli używasz zbiorczego pobierania wierszy, implementacja parametrów jest podobnym procesem. Aby uzyskać więcej informacji, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).

Przed utworzeniem klasy zestawu rekordów określ, jakie parametry są potrzebne, jakie są ich typy danych i jak używa ich zestaw rekordów.

Aby sparametryzować klasę zestawu rekordów

Uwaga

Kreator klienta MFC ODBC nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach. Nadal można ręcznie utworzyć tę funkcję.

  1. Uruchom Kreatora konsumenta MFC ODBC z dodaj klasę, aby utworzyć klasę.

  2. Określ elementy członkowskie danych pól dla kolumn zestawu rekordów.

  3. Po zapisaniu klasy do pliku w projekcie przejdź do pliku h i ręcznie dodaj co najmniej jeden składowy danych parametrów do deklaracji klasy. Dodanie może wyglądać podobnie do poniższego przykładu, części klasy migawki przeznaczonej do odpowiadania na zapytanie "Którzy uczniowie znajdują się w klasie starszej?"

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

    Dodaj składowe danych parametrów po elementach członkowskich danych pól wygenerowanych przez kreatora. Konwencja polega na dołączeniu słowa "Param" do każdej nazwy parametru zdefiniowanego przez użytkownika.

  4. Zmodyfikuj definicję funkcji składowej DoFieldExchange w pliku cpp. Dodaj wywołanie funkcji RFX dla każdego elementu członkowskiego danych parametrów dodanego do klasy. Aby uzyskać informacje na temat pisania funkcji RFX, zobacz Wymiana pól rekordów: Jak działa RFX. Poprzedzaj wywołania RFX dla parametrów za pomocą jednego wywołania:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. W konstruktorze klasy zestawu rekordów zwiększ liczbę parametrów , m_nParams.

    Aby uzyskać informacje, zobacz Wymiana pól rekordów: praca z kodem kreatora.

  6. Podczas pisania kodu, który tworzy obiekt zestawu rekordów tej klasy, umieść element "?" (znak zapytania) symbol w każdym miejscu w ciągach instrukcji SQL, w których parametr ma zostać zamieniony.

    W czasie wykonywania symbole zastępcze "?" są wypełniane w kolejności przez przekazane wartości parametrów. Pierwszy element członkowski danych parametru ustawiony po wywołaniu SetFieldType zastępuje pierwszy element "?" w ciągu SQL, drugi element członkowski danych parametru zastępuje drugi element "?", itd.

Uwaga

Kolejność parametrów jest ważna: kolejność wywołań RFX dla parametrów w DoFieldExchange funkcji musi być zgodna z kolejnością symboli zastępczych parametrów w ciągu SQL.

Napiwek

Najbardziej prawdopodobnym ciągiem, z którym można pracować, jest ciąg określony (jeśli istnieje) dla składowej danych m_strFilter klasy, ale niektóre sterowniki ODBC mogą zezwalać na parametry w innych klauzulach SQL.

Przekazywanie wartości parametrów w czasie wykonywania

Przed wywołaniem Open (dla nowego obiektu zestawu rekordów) lub Requery (dla istniejącego obiektu) należy określić wartości parametrów.

Aby przekazać wartości parametrów do obiektu zestawu rekordów w czasie wykonywania

  1. Skonstruuj obiekt zestawu rekordów.

  2. Przygotuj ciąg lub ciągi, takie jak m_strFilter ciąg, zawierający instrukcję SQL lub jego części. Umieść symbole zastępcze "?", w których należy przejść informacje o parametrach.

  3. Przypisz wartość parametru czasu wykonywania do każdego elementu członkowskiego danych parametru obiektu.

  4. Wywołaj funkcję składową Open (lub Requery, dla istniejącego zestawu rekordów).

Załóżmy na przykład, że chcesz określić ciąg filtru dla zestawu rekordów przy użyciu informacji uzyskanych w czasie wykonywania. Załóżmy, że utworzono wcześniej zestaw rekordów klasy CStudentSet — o nazwie rsStudents — i teraz chcesz ponownie utworzyć go dla określonego rodzaju informacji o uczniach.

// 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;

Zestaw rekordów zawiera rekordy dla tych uczniów, których rekordy spełniają warunki określone przez filtr, który został skonstruowany z parametrów czasu wykonywania. W tym przypadku zestaw rekordów zawiera rekordy dla wszystkich starszych studentów.

Uwaga

W razie potrzeby można ustawić wartość elementu członkowskiego danych parametru na wartość Null, używając polecenia SetParamNull. Możesz również sprawdzić, czy element członkowski danych parametrów ma wartość Null, używając polecenia IsFieldNull.

Zobacz też

Zestaw rekordów (ODBC)
Zestaw rekordów: dodawanie, aktualizowanie i usuwanie rekordów (ODBC)
Zestaw rekordów: jak zestawy rekordów pobierają rekordy (ODBC)