MICROSOFT FOUNDATION CLASSES OBSŁUGA BAZ DANYCH STANDARDY OBSŁUGIWANE PRZEZ MFC: •∋ ODBC (Open DataBase Connectivity) •∋ DAO (Data Access Objects) •∋ OLE DB NAJWAŻNIEJSZE KLASY: ODBC CDatabase CRecordset CRecordView – – – DAO CDaoDatabase CDaoRecordset CDaoRecordView CDaoWorkspace CDaotableDef CDaoQueryDef opis połączenie z bazą danych zbiór rekordów wybranych instrukcją SELECT, często cała tabela widok formularza bazy danych sesja – od zalogowania się aż do wylogowania tabela bazy danych kwerenda bazy danych (zwykle zdefiniowana w bazie danych) KORZYSTANIE Z OBIEKTÓW BAZ DANYCH (CDATABASE/CDAODATABASE) W typowych aplikacjach programista w ogóle nie ma styczności z obiektami tej klasy. Są one stosowane przy tworzeniu rekordsetów, jednakże można wymusić ich automatyczne tworzenie (poprzez podanie NULL). Celowe jest utworzenie obiektu tej klasy, jeśli chcemy, by kilka rekordsetów korzystało z tego samego połączenia, oraz przy realizacji pewnych globalnych operacji na bazie. KORZYSTANIE Z REKORDSETÓW (CRECORDSET/CDAORECORDSET) W praktyce główny obiekt reprezentujący dane. W najprostszym przypadku odnosi się do całej tabeli; jednak przy otwieraniu rekordsetu można użyć instrukcji SELECT języka SQL celem odfiltrowania potrzebnego zbioru rekordów. Rekordset reprezentuje w danej chwili dane związane z określonym wierszem tabeli (zestawem pól jednego rekordu); stosowne funkcje pozwalają przesuwać się wzdłuż tabeli. Dostęp do danych można łatwo zrealizować za pomocą zmiennych składowych, które można wiązać z odpowiednimi polami bazy danych. Odbywa się to w podobny sposób, jak wiązanie okien kontrolnych dialogu ze zmiennymi składowymi obiektu CDialog. Wartości opisywanych zmiennych są przy każdym przesunięciu wzdłuż tabeli odświeżane – zarówno w sensie zapisu zmodyfikowanych wartości rekordu do bazy, jak i odczytu wartości dla nowego rekordu. Dowiązanie zmiennych rekordsetu do pól bazy danych jest realizowane przez ClassWizarda. TWORZENIE I OTWIERANIE REKORSETU: CRecordet (CDaoRecordset) – konstruktor pobiera wskaźnik na obiekt CDatabase (CDaoDataBase). Podanie NULL spowoduje otwarcie nowego połączenia na podstawie danych zwróconych przez GetDefaultConnect. GetDefaultConnect – określa domyślne źródło danych. Open – otwiera rekordset. Można określić instrukcję języka SQL definiującą zbiór rekordów (np. „SELECT * FROM Pracownicy WHERE pensja > 1000”). Domyślnie brana jest instrukcja dostarczona przez GetDefaultSQL. GetDefaultSQL – określa domyślną instrukcję SQL stosowaną przy otwieraniu. m_strSort – (zmienna składowa) określa sposób sortowania rekordów (klauzula SQL ORDER BY). m_strFilter – (zmienna składowa) określa sposób filtrowania rekordów (klauzula SQL WHERE). ATRYBUTY (WYBRANE): CanAppend – określa, czy do bazy można dodawać rekordy (por. AddNew). CanBookmark – określa, czy można stosować zakładki (por. GetBookmark i SetBookmark). CanTransact – określa, czy baza obsługuje transakcje. CanUpdate – określa, czy można dodawać, zmieniać lub usuwać rekordy. GetRecordCount – zwraca liczbę rekordów w tabeli. GetTableName – zwraca nazwę tabeli. NAWIGACJA (URUCHAMIAJĄ WYMIANĘ DANYCH MIĘDZY REKORDSETEM A BAZĄ DANYCH): MoveFirst, MoveLast, MovePrev, MoveNext – przesuwa wskaźnik bieżącego rekordu na początek/koniec bazy lub do poprzedniego/poprzedniego rekordu. Move – przesuwa wskaźnik bieżącego rekordu o podaną liczbę pozycji. SetAbsolutePosition – przesuwa wskaźnik bieżącego rekordu do bezwzględnej pozycji w tabeli. GetBookmark, SetBookmark – obsługa nawigacji przy pomocy zakładek. Find, FindFirst, FindLast, FindPrev, FindNext (tylko CDaoRecordset) – nawigacja z wyszukiwaniem według określonych kryteriów (jak w SELECT WHERE). IsBOF, IsEOF – sprawdza, czy wskaźnik bieżącego rekordu znajduje się na przed pierwszym / za ostatnim rekordem w tabeli. MODYFIKOWANIE BAZY DANYCH: AddNew – przygotowuje do dodania rekordu – wywołaj Update by zakończyć operację. Edit – przygotowuje do edycji (modyfikacji) rekordu – wywołaj Update by zakończyć operację. Update – kończy operacje zainicjowane przez AddNew/Edit poprzez zapis danych do bazy. CancelUpdate – anuluje uprzednie wywołanie AddNew/Edit. Delete – zaznacza bieżący rekord do usunięcia. IsDeleted – określa, czy bieżący rekord został zaznaczony do usunięcia. INNE: DoFieldExchange – realizuje wymianę danych pomiędzy rekordsetem a bazą danych. Requery – ponownie przeprowadza zapytanie do bazy danych, tj. odświeża zawartość rekordsetu. KORZYSTANIE Z ARCHITEKTURY DOKUMENT–WIDOK (CRECORDVIEW/CDAORECORDVIEW) W przypadku aplikacji bazodanowych rolę dokumentu spełnia de facto obiekt bazodanowy, a w szczególności główny używany przez program rekordset lub zestaw rekordsetów. Rola dokumentu (obiektu CDocument) ogranicza się zatem do tego, że zawiera on co najmniej jedną zmienną składową tego typu. Obiekty widoku rekordu obsługują typowy formularz bazodanowy. Klasa pochodzi od CFormView, stanowi więc pod względem funkcjonalnym mieszankę dokumentu i widoku. Z każdym obiektem widoku wiąże się jeden obiekt rekordsetu; z poszczególnymi oknami kontrolnymi można wiązać zarówno własne zmienne widoku, jak i zmienne tego rekordestu. W ten sposób okna kontrolne mogą być pośrednio (poprzez zmienne rekordsetu) związane z polami bazy danych. Tworzenie takich powiązań jest wspierane przez ClassWizarda. WYBRANE FUNKCJE SKŁADOWE: OnGetRecordset – funkcja wirtualna, zwraca wskaźnik na rekordset związany z widokiem; zwykle zwraca jest to wskaźnik na odpowiednią zmienną obiektu dokumentu. OnMove – funkcja wirtualna wywoływana podczas nawigacji (przy każdej zmianie bieżącego rekordu) DoDataExchange – funkcja analogiczna do CDialog::DoDataExchange; realizuje wymianę danych między oknami kontrolnymi a zmiennymi (widoku i rekordsetu) – można ją wykorzystać do wprowadzenia niestandardowych metod prezentacji danych. TWORZENIE APLIKACJI BAZODANOWYCH Podstawową aplikację bazodanową generuje AppWizard. Zawiera ona obiekt rekordsetu, dowiązany do wskazanej przez programistę tabeli i zawierający komplet zmiennych powiązanych z jej polami (kolumnami). Ponadto aplikacja zawiera widok formularza bazy oraz zestaw opcji i przycisków na toolbarze pozwalających na nawigację wzdłuż tabeli. Zadaniem użytkownika jest wprowadzenie do wyświetlanego przez widok, początkowo pustego formularza własnych okien kontrolnych i dowiązanie ich – za pomocą ClassWizarda – do zmiennych składowych rekordsetu. Efektem jest prosta aplikacja pozwalająca na przeglądanie i edycję rekordów. Aby wyświetlić dane w sposób niekonwencjonalny – np. za pomocą innych okien kontrolnych, niż obsługiwane przez Class Wizarda dla danego typu danych – można wprowadzić dodatkowe przekształcenia w funkcji widoku DoDataExchange. Dla inicjalizacji okien tylko do odczytu (np. przy prezentacji wyników przeliczenia wartości pól bazy lub listy wartości pochodzącej z innej, połączonej relacją tabeli) stosownym miejscem jest też OnMove. Często analizuje się inne, niż główna tabele. Warto wówczas za pomocą ClassWizarda stworzyć specjalną klasę pochodzącą od CRecordset. W funkcji Open możemy narzucić filtrację instrukcją SQL SELECT. Korzystając z while (!theSet.IsEOF()) { ... ; theSetMoveNext(); } można następnie przeglądnąć cały zbiór rekordów.