Udostępnij za pośrednictwem


Zestaw rekordów: dynamiczne powiązanie kolumn danych (ODBC)

Ten temat dotyczy klas MFC ODBC.

Zestawy rekordów zarządzają kolumnami tabeli powiązań, które są określone w czasie projektowania, ale istnieją przypadki, w których można powiązać kolumny, które były nieznane w czasie projektowania. W tym temacie opisano:

Uwaga

Ten temat dotyczy obiektów pochodnych, CRecordset z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Opisane techniki zwykle nie są zalecane, jeśli używasz pobierania wierszy zbiorczych. Aby uzyskać więcej informacji na temat zbiorczego pobierania wierszy, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).

Dynamiczne wiązanie kolumn

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.

W czasie projektowania Kreator aplikacji MFC lub Kreator konsumenta MFC ODBC (z dodaj klasę) tworzy klasy zestawów rekordów na podstawie znanych tabel i kolumn w źródle danych. Bazy danych mogą się zmieniać podczas projektowania ich i później, gdy aplikacja używa tych tabel i kolumn w czasie wykonywania. Użytkownik lub inny użytkownik może dodawać lub usuwać tabelę albo dodawać lub usuwać kolumny z tabeli, na której opiera się zestaw rekordów aplikacji. Prawdopodobnie nie jest to problem ze wszystkimi aplikacjami dostępu do danych, ale jeśli jest przeznaczony dla Ciebie, jak można poradzić sobie ze zmianami w schemacie bazy danych, poza przeprojektowaniem i ponownym komplikowaniem? Celem tego tematu jest udzielenie odpowiedzi na to pytanie.

W tym temacie opisano najbardziej typowy przypadek, w którym kolumny mogą być powiązane dynamicznie — rozpoczynając od zestawu rekordów na podstawie znanego schematu bazy danych, chcesz obsługiwać dodatkowe kolumny w czasie wykonywania. W dalszej części tego tematu przyjęto założenie, że dodatkowe kolumny są mapowane na składowe CString danych pól, jednak najczęściej używane są sugestie ułatwiające zarządzanie innymi typami danych.

Przy niewielkiej ilości dodatkowego kodu można wykonywać następujące czynności:

Zestaw rekordów nadal zawiera elementy członkowskie danych dla kolumn, o których wiesz w czasie projektowania. Zawiera również niewielką ilość dodatkowego kodu, który dynamicznie określa, czy do tabeli docelowej zostały dodane nowe kolumny, a jeśli tak, wiąże te nowe kolumny z dynamicznie przydzielonym magazynem (a nie elementami członkowskimi danych zestawu rekordów).

Ten temat nie obejmuje innych dynamicznych przypadków powiązań, takich jak porzucone tabele lub kolumny. W takich przypadkach należy użyć bardziej bezpośredniego wywołania interfejsu API ODBC. Aby uzyskać informacje, zobacz dokumentację programisty ODBC.

Jak dynamicznie powiązać kolumny

Aby dynamicznie powiązać kolumny, musisz wiedzieć (lub być w stanie określić) nazwy dodatkowych kolumn. Należy również przydzielić magazyn dla dodatkowych składowych danych pól, określić ich nazwy i typy oraz określić liczbę dodawanych kolumn.

W poniższej dyskusji wymieniono dwa różne zestawy rekordów. Pierwszy to główny zestaw rekordów, który wybiera rekordy z tabeli docelowej. Drugi to specjalny zestaw rekordów kolumn używany do uzyskiwania informacji o kolumnach w tabeli docelowej.

Ogólny proces

Na najbardziej ogólnym poziomie wykonaj następujące kroki:

  1. Skonstruuj główny obiekt zestawu rekordów.

    Opcjonalnie przekaż wskaźnik do otwartego CDatabase obiektu lub możesz podać informacje o połączeniu z zestawem rekordów kolumn w inny sposób.

  2. Wykonaj kroki, aby dynamicznie dodawać kolumny.

    Zobacz proces opisany w artykule Dodawanie kolumn poniżej.

  3. Otwórz główny zestaw rekordów.

    Zestaw rekordów wybiera rekordy i używa wymiany pól rekordów (RFX) do powiązania obu kolumn statycznych (mapowanych na składowe danych pól zestawu rekordów) i kolumn dynamicznych (mapowanych na dodatkowy magazyn, który przydzielasz).

Dodawanie kolumn

Dynamiczne wiązanie dodanych kolumn w czasie wykonywania wymaga następujących kroków:

  1. Określ w czasie wykonywania, jakie kolumny znajdują się w tabeli docelowej. Wyodrębnij z tych informacji listę kolumn, które zostały dodane do tabeli od czasu zaprojektowania klasy zestawu rekordów.

    Dobrym rozwiązaniem jest użycie klasy zestawu rekordów kolumn przeznaczonej do wykonywania zapytań względem źródła danych pod kątem informacji o kolumnie dla tabeli docelowej (np. nazwy kolumny i typu danych).

  2. Podaj magazyn dla nowych elementów członkowskich danych pól. Ponieważ główna klasa zestawu rekordów nie zawiera składowych danych pól dla nieznanych kolumn, należy podać miejsce do przechowywania nazw, wartości wyników i ewentualnie informacji o typie danych (jeśli kolumny są różnymi typami danych).

    Jednym z podejść jest utworzenie co najmniej jednej listy dynamicznej, jednej dla nazw nowych kolumn, innej wartości wyników i trzeciej dla ich typów danych (w razie potrzeby). Te listy, szczególnie lista wartości, zawierają informacje i niezbędny magazyn do powiązania. Na poniższej ilustracji przedstawiono tworzenie list.

    Tworzenie list kolumn, które mają być powiązane dynamicznie.
    Tworzenie list kolumn do dynamicznego wiązania

  3. Dodaj wywołanie funkcji RFX w funkcji głównego zestawu DoFieldExchange rekordów dla każdej dodanej kolumny. Te wywołania RFX wykonują pracę podczas pobierania rekordu, w tym dodatkowych kolumn, i powiązania kolumn z elementami członkowskimi danych zestawu rekordów lub dynamicznego magazynu dla nich.

    Jednym z podejść jest dodanie pętli do funkcji głównego zestawu DoFieldExchange rekordów, która przechodzi przez listę nowych kolumn, wywołując odpowiednią funkcję RFX dla każdej kolumny na liście. Na każdym wywołaniu RFX przekaż nazwę kolumny z listy nazw kolumn i lokalizację magazynu w odpowiednim elemencie listy wartości wyników.

Listy kolumn

Cztery listy, z których musisz pracować, są wyświetlane w poniższej tabeli.

List opis
Kolumny bieżącej tabeli (Lista 1 na ilustracji) Lista kolumn znajdujących się obecnie w tabeli w źródle danych. Ta lista może być zgodna z listą kolumn obecnie powiązanych w zestawie rekordów.
Powiązane zestawy rekordów — kolumny (Lista 2 na ilustracji) Lista kolumn powiązanych w zestawie rekordów. Te kolumny mają już instrukcje RFX w DoFieldExchange funkcji.
Kolumny do powiązania dynamicznie (Lista 3 na ilustracji) Lista kolumn w tabeli, ale nie w zestawie rekordów. Są to kolumny, które chcesz powiązać dynamicznie.
Wartości kolumny dynamicznej (Lista 4 na ilustracji) Lista zawierająca magazyn wartości pobranych z kolumn, które są powiązane dynamicznie. Elementy tej listy odpowiadają elementom w kolumnach do powiązania dynamicznie, jeden do jednego.

Kompilowanie list

Mając na uwadze ogólną strategię, możesz zwrócić się do szczegółów. Procedury w pozostałej części tego tematu pokazują, jak utworzyć listy wyświetlane w listach kolumn. Procedury prowadzą przez następujące czynności:

Określanie, które kolumny tabeli nie znajdują się w zestawie rekordów

Utwórz listę (Bound-Recordset-Columns, jak na liście 2 na ilustracji), która zawiera listę kolumn już powiązanych w głównym zestawie rekordów. Następnie skompiluj listę (kolumny do powiązania dynamicznie pochodzące z kolumn Current-Table-Columns i Bound-Recordset-Columns), która zawiera nazwy kolumn w tabeli w źródle danych, ale nie w głównym zestawie rekordów.

Aby określić nazwy kolumn, które nie są w zestawie rekordów (kolumny do powiązania dynamicznie)
  1. Utwórz listę (Bound-Recordset-Columns) kolumn już powiązanych w głównym zestawie rekordów.

    Jednym z podejść jest utworzenie kolumn Bound-Recordset-Columns w czasie projektowania. Możesz wizualnie zbadać wywołania funkcji RFX w funkcji zestawu DoFieldExchange rekordów, aby uzyskać te nazwy. Następnie skonfiguruj listę jako tablicę zainicjowaną z nazwami.

    Na przykład na ilustracji przedstawiono kolumny Bound-Recordset-Columns (Lista 2) z trzema elementami. W kolumnach Bound-Recordset-Columns brakuje kolumny Phone wyświetlanej w kolumnach Current-Table-Columns (Lista 1).

  2. Porównaj kolumny Current-Table-Columns i Bound-Recordset-Columns, aby utworzyć listę (kolumny-powiązanie-dynamicznie) kolumn, które nie są jeszcze powiązane w głównym zestawie rekordów.

    Jednym z podejść jest pętla przez listę kolumn w tabeli w czasie wykonywania (Current-Table-Columns) i listę kolumn już powiązanych w zestawie rekordów (Bound-Recordset-Columns) równolegle. W kolumnach typu kolumny-powiązanie-dynamicznie umieść wszystkie nazwy w kolumnach Current-Table-Columns, które nie są wyświetlane w kolumnach powiązanych rekordów.

    Na przykład na ilustracji przedstawiono kolumny-powiązanie-dynamicznie (lista 3) z jednym elementem: kolumna Phone znaleziona w kolumnie Current-Table-Columns (Lista 1), ale nie w kolumnach Bound-Recordset-Columns (Lista 2).

  3. Utwórz listę wartości dynamic-column-values (podobnie jak na liście 4 na ilustracji), w której mają być przechowywane wartości danych odpowiadające każdej nazwie kolumny przechowywanej na liście kolumn w celu dynamicznego powiązania (kolumny do powiązania dynamicznie).

    Elementy tej listy odgrywają rolę nowych elementów członkowskich danych pól zestawu rekordów. Są to lokalizacje przechowywania, do których są powiązane kolumny dynamiczne. Opisy list można znaleźć w temacie Listy kolumn.

Udostępnianie magazynu dla nowych kolumn

Następnie skonfiguruj lokalizacje przechowywania kolumn, które mają być powiązane dynamicznie. Chodzi o podanie elementu listy, w którym ma być przechowywana wartość każdej kolumny. Te lokalizacje magazynu są równoległe do zmiennych składowych zestawu rekordów, które przechowują zwykle powiązane kolumny.

Aby zapewnić dynamiczny magazyn dla nowych kolumn (Dynamic-Column-Values)

  1. Utwórz wartości dynamiczne-kolumnowe, równolegle z kolumnami do powiązania dynamicznie, aby zawierać wartość danych w każdej kolumnie.

    Na przykład ilustracja przedstawia wartości dynamiczne-kolumnowe (Lista 4) z jednym elementem: CString obiekt zawierający rzeczywisty numer telefonu dla bieżącego rekordu: "555-1212".

    W najczęstszym przypadku wartość Dynamic-Column-Values ma elementy typu CString. Jeśli masz do czynienia z kolumnami o różnych typach danych, potrzebujesz listy, która może zawierać elementy różnych typów.

Wynikiem powyższych procedur są dwie główne listy: Kolumny do powiązania dynamicznie zawierające nazwy kolumn i Wartości dynamiczne zawierające wartości w kolumnach dla bieżącego rekordu.

Napiwek

Jeśli nowe kolumny nie są tym samym typem danych, możesz potrzebować dodatkowej listy równoległej zawierającej elementy, które w jakiś sposób definiują typ każdego odpowiedniego elementu na liście kolumn. (Jeśli chcesz, możesz użyć wartości AFX_RFX_BOOL, AFX_RFX_BYTE itd. Te stałe są definiowane w AFXDB.H.) Wybierz typ listy na podstawie sposobu reprezentowania typów danych kolumn.

Dodawanie wywołań RFX w celu powiązania kolumn

Na koniec rozmieść powiązanie dynamiczne, umieszczając wywołania RFX dla nowych kolumn w DoFieldExchange funkcji.

Aby dynamicznie dodawać wywołania RFX dla nowych kolumn
  1. W funkcji składowej DoFieldExchange głównego zestawu rekordów dodaj kod, który wykonuje pętle na liście nowych kolumn (kolumny do powiązania dynamicznie). W każdej pętli wyodrębnij nazwę kolumny z kolumn do powiązania dynamicznie i wartość wyniku dla kolumny z kolumny Dynamic-Column-Values. Przekaż te elementy do wywołania funkcji RFX odpowiedniego dla typu danych kolumny. Opisy list można znaleźć w temacie Listy kolumn.

W typowym przypadku w RFX_Text funkcji wywołujesz wyodrębnianie CString obiektów z list, tak jak w następujących wierszach kodu, gdzie kolumny-powiązanie-dynamicznie jest wywoływaneCStringList, a dynamiczne-kolumny-wartości są CStringList nazywane :m_listName m_listValue

RFX_Text( pFX,
            m_listName.GetNext( posName ),
            m_listValue.GetNext( posValue ));

Aby uzyskać więcej informacji na temat funkcji RFX, zobacz Makra i globalne w dokumentacji biblioteki klas.

Napiwek

Jeśli nowe kolumny są różnymi typami danych, użyj instrukcji switch w pętli, aby wywołać odpowiednią funkcję RFX dla każdego typu.

Gdy struktura wywołuje DoFieldExchange proces Open powiązania kolumn z zestawem rekordów, RFX wywołuje kolumny statyczne powiązane z tymi kolumnami. Następnie pętla wielokrotnie wywołuje funkcje RFX dla kolumn dynamicznych.

Zobacz też

Zestaw rekordów (ODBC)
Zestaw rekordów: praca z dużymi elementami danych (ODBC)