1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

OSE 1 Katedra Optoelektroniki i Systemów Elektronicznych OSE 2 System otwartych baz danych ODBC Oprogramowanie Systemów Elektronicznych Zagadnien...
0 downloads 2 Views 610KB Size
OSE 1

Katedra Optoelektroniki i Systemów Elektronicznych

OSE 2

System otwartych baz danych ODBC

Oprogramowanie Systemów Elektronicznych

Zagadnienia: 1. Interfejs ODBC 2. Pola i metody klasy CRecordset 3. Przykład aplikacji bazodanowej

Temat wykładu

System otwartych baz danych ODBC

OSE 3

OSE 4

Interfejs ODBC

Interfejs ODBC

ODBC (Open DataBase Connectivity) – uniwersalny interfejs programowania pozwalający aplikacjom uzyskać dostęp do dowolnej bazy danych, w której jako standard dostępu do danych jest używany język SQL.

Sterownik ODBC (ODBC Driver) – interpretuje zapytania SQL-a na format zrozumiały dla określonej bazy danych. Sterownik ODBC jest zwykle dostarczany przez firmę produkującą daną bazę lub przez dostawców niezależnych.

SQL (Structured Query Language) – język zarządzania bazami danych takimi jak: Oracle, Informix, Sybase, Microsoft SQL Server, Paradox, Access, dBASE i innych - w sumie 140 produktach.

Administrator źródła danych ODBC (ODBC Driver Manager) - menedżer ODBC pozwalający na konfigurowanie źródeł baz danych dostępnych na poziomie systemu operacyjnego. CRecordset – klasa w MFC zawierająca zbiór rekordów bazy danych

APPLICATION CRecordset

SQL

ODBC Driver

OSE 5

APPLICATION

ODBC Driver Manager

CRecordset DATA SOURCE

System otwartych baz danych ODBC

Zagadnienia: 1. Interfejs ODBC 2. Pola i metody klasy CRecordset 3. Przykład aplikacji bazodanowej

SQL

ODBC Driver Manager ODBC Driver

OSE 6

DATA SOURCE

Pola i metody klasy CRecordset

Metoda Open otwiera zbiór rekordów. virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none ); Parametry: nOpenType – typ zbioru rekordów CRecordset::dynaset – Zbiór rekordów, który może być odświeżany przez wywołanie funkcji Fetch, dzięki czemu widoczne są zmiany wprowadzone do zbioru rekordów przez innych użytkowników CRecordset::snapshot – Zbiór rekordów, który nie może być odświeżany bez zamykania i ponownego otwierania zbioru rekordów. CRecordset::dynamic – Podobny do dynaset, ale nie dostępny w wielu sterownikach Recordset::forwardOnly – Zbiór rekordów tylko do odczytu, który może być jedynie przeglądany od pierwszego do ostatniego elementu

1.1

OSE 7

Pola i metody klasy CRecordset

OSE 8

Pola i metody klasy CRecordset

Parametry metody Open cd. lpszSQL – wyrażenie SQL, które ma zostać wykonane

Poruszanie się po zbiorze rekordów Funkcja

w celu wygenerowania zbioru rekordów dwOptions – znaczniki otwarcia zbioru rekordów: CRecordset::none – brak opcji (wartość domyślna) CRecordset::appendOnly – tylko dodawanie rekordów CRecordset::readOnly – tylko odczytywanie rekordów

MoveFirst

Przejście do pierwszego rekordu

MoveLast

Przejście do ostatniego rekordu

MoveNext

Przejście do następnego rekordu

MovePrev

Przejście do poprzedniego rekordu

Move

Przejście o określoną liczbę rekordów względem aktualnej pozycji lub względem pierwszego rekordu

SetAbsolutePosition

Przejście do określonego rekordu

IsBOF

Czy wskaźnik znajduje się przed pierwszym rekordem?

IsEOF

Czy wskaźnik znajduje się poza ostatnim rekordem?

GetRecordCount

Zwraca liczbę rekordów

Metoda Close zamyka zbiór rekordów.

CanScroll

Czy można przechodzić między rekordami?

Numeracja rekordów:

OSE 9

Pola i metody klasy CRecordset

Poruszanie się po zbiorze rekordów // Open a recordset; first record is current CRecordset *m_pSet; m_pSet->Open( ); if( m_pSet->IsBOF( ) ) return; // The recordset is empty // Scroll to the end of the recordset, past // the last record, so no record is current while ( !m_pSet->IsEOF( ) ) m_pSet->MoveNext( ); // Move to the last record m_pSet->MoveLast( );

OSE 11

Pola i metody klasy CRecordset

Dodawanie, usuwanie i modyfikowanie rekordów Funkcja

Opis

AddNew

Dodaje nowy rekord do zbioru

Delete

Usuwa bieżący rekord ze zbioru

Edit

Umożliwia edycję bieżącego rekordu

Update

Zapisuje bieżące zmiany w bazie danych

Requery

Pozwala na odświeżenie zbioru rekordów

CancelUpadate

Anuluje wszystkie zalegające aktualizacje (pochodzące z AddNew lub Update)

CanAppend

Czy można dodawać nowe rekordy?

CanUpdate

Czy można zapisać zmiany?

CanRestart

Czy można odświeżyć zbiór rekordów?

CanScroll

Czy można przechodzić między rekordami?

OSE 10

Opis

0 BOF

1 rekord 1

...

N rekord N

N+1 EOF

Pola i metody klasy CRecordset

Poruszanie się po zbiorze rekordów // Scroll to beginning of the recordset, before // the first record, so no record is current while( !m_pSet->IsBOF( ) ) m_pSet->MovePrev( ); // First record is current again m_pSet->MoveFirst( ); Zliczanie liczby rekordów if (m_pSet->IsBOF( ) && m_pSet->IsEOF( )) m_count = 0; } else { m_pSet->MoveFirst(); while ( !m_pSet->IsEOF( ) ) m_pSet->MoveNext( ); m_count = m_pSet->GetRecordCount( ); }

OSE 12

Pola i metody klasy CRecordset

Sekwencja funkcji dodających nowy rekord // Dodanie nowego rekordu m_pSet->AddNew(); // Ustawienie identyfikatora w nowym rekordzie m_pSet->m_Id = m_count + 1; // Zapisanie nowego rekordu m_pSet->Update(); // Odświeżenie zbioru rekordów m_pSet->Requery(); // Przejście do nowego rekordu m_pSet->MoveLast();

1.2

OSE 13

Pola i metody klasy CRecordset

OSE 14

Sekwencja funkcji usuwających rekord m_pSet->Delete(); m_pSet->Requery(); // aktualny rekord numer 1 --m_count; if (m_count == 0) m_currRecord = 0; if (m_currRecord > 1) { --m_currRecord; m_pSet->SetAbsolutePosition(m_currRecord); }

System otwartych baz danych ODBC

Zagadnienia: 1. Interfejs ODBC 2. Pola i metody klasy CRecordset 3. Przykład aplikacji bazodanowej

Sekwencja funkcji umożliwiających edycję bieżącego rekordu pSet->Edit(); // Zezwolenie na edycję bieżącego rekordu // Aktualizacja pól rekordu // ... pSet->Update(); // Zapisanie zmian

OSE 15

Przykład aplikacji bazodanowej

Konfigurowanie źródła danych

OSE 17

Przykład aplikacji bazodanowej

Konfigurowanie źródła danych

OSE 16

Przykład aplikacji bazodanowej

Konfigurowanie źródła danych

OSE 18

Przykład aplikacji bazodanowej

Tworzenie programu przy pomocy kreatora

1.3

OSE 19

Przykład aplikacji bazodanowej

Tworzenie programu przy pomocy kreatora

OSE 20

Przykład aplikacji bazodanowej

Projekt panelu czołowego Dynaset – umożliwia dynamiczną pracę z rekordami, wspólnie z innymi użytkownikami. Snapshot – umożliwia pracę z rekordami zawierającymi dane z chwili ich pobrania.

OnFirst OnPrev OnNext OnLast OnEdit

OnRemove

OnUpdate

OSE 21

Przykład aplikacji bazodanowej

Łączenie obiektów z polami bazy danych

OSE 23

Przykład aplikacji bazodanowej

Inicjalizacja klasy widoku void CElementyView::OnInitialUpdate() { // Kod utworzony przez kreatora aplikacji m_pSet = &GetDocument()->m_elementySet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); // Kod dodany GetCount(); EnableEdit(FALSE); EnableNaviButtons(TRUE); UpdateData(FALSE);

OSE 22

OnCancelUpdate

OnAdd

OnRemoveAll

Przykład aplikacji bazodanowej

Klasa widoku class CElementyView : public CRecordView { public : CElementyView(); ~CElementyView(); public: CElementySet* m_pSet; long m_currRecord, m_count; // called first time after construct virtual void OnInitialUpdate(); private: void GetCount(); // ustalenie liczby rekordów // funkcje kontrolujące dostępność przycisków na panelu void EnableEdit(BOOL); void EnableNaviButtons(BOOL); }

OSE 24

Przykład aplikacji bazodanowej

Liczba rekordów void CElementyView::GetCount() { if (m_pSet->IsBOF( ) && m_pSet->IsEOF( )) { m_count = 0; m_currRecord = 0; } else { m_pSet->MoveFirst(); while ( !m_pSet->IsEOF( ) ) m_pSet->MoveNext( ); m_count = m_pSet->GetRecordCount( ); m_pSet->MoveFirst(); m_currRecord = 1; } UpdateData(FALSE); }

}

1.4

OSE 25

Przykład aplikacji bazodanowej

Nawigacja 1/2 void CElementyView::OnFirst() { if (m_currRecord > 1) { m_pSet->MoveFirst(); m_currRecord = 1; EnableNaviButtons(TRUE); UpdateData(FALSE); } } void CElementyView::OnLast() { if (m_currRecord < m_count) { m_pSet->MoveLast(); m_currRecord = m_count; EnableNaviButtons(TRUE); UpdateData(FALSE); } }

OSE 27

Przykład aplikacji bazodanowej

Edycja rekordu void CElementyView::OnEdit() { m_pSet->Edit(); EnableEdit(TRUE); EnableNaviButtons(FALSE); } void CElementyView::OnUpdate() { UpdateData(TRUE); m_pSet->Update(); EnableEdit(FALSE); EnableNaviButtons(TRUE); } void CElementyView::OnCancelUpdate() { UpdateData(FALSE); m_pSet->CancelUpdate(); EnableEdit(FALSE); EnableNaviButtons(TRUE); }

OSE 29

Przykład aplikacji bazodanowej

Usuwanie rekordu void CElementyView::OnRemove() { if ((m_count > 0) && (MessageBox("Are you sure?", "Deleting record", MB_YESNO | MB_ICONQUESTION) == IDYES)){ // Usunięcie rekordu m_pSet->Delete(); m_pSet->Requery(); --m_count; if (m_count == 0) { m_currRecord = 0; m_pSet->m_Id = 0; m_pSet->m_Value = 0; } if (m_currRecord > 1) { --m_currRecord; m_pSet->SetAbsolutePosition(m_currRecord); } EnableEdit(FALSE); EnableNaviButtons(TRUE); UpdateData(FALSE); } }

OSE 26

Przykład aplikacji bazodanowej

Nawigacja 2/2 void CElementyView::OnPrev() { if (m_currRecord > 1) { m_pSet->MovePrev(); --m_currRecord; EnableNaviButtons(TRUE); UpdateData(FALSE); } } void CElementyView::OnNext() { if (m_currRecord < m_count) { m_pSet->MoveNext(); ++m_currRecord; EnableNaviButtons(TRUE); UpdateData(FALSE); } }

OSE 28

Przykład aplikacji bazodanowej

Dodawanie rekordu void CElementyView::OnAdd() { m_pSet->AddNew(); // Dodanie nowego rekordu // Ustawienie identyfikatora w nowym rekordzie m_pSet->m_Id = m_count + 1; m_pSet->Update(); // Zapisanie nowego rekordu m_pSet->Requery(); // Odświeżenie zbioru rekordów m_pSet->MoveLast(); // Przejście do nowego rekordu ++m_count; m_currRecord = m_count; EnableEdit(FALSE); EnableNaviButtons(TRUE); // Uaktualnienie formularza UpdateData(FALSE); }

OSE 30

Przykład aplikacji bazodanowej

Usuwanie wszystkich rekordów void CElementyView::OnRemoveAll() { if ((m_count > 0) && (MessageBox("Are you sure?", "Deleting all records„,MB_YESNO|MB_ICONQUESTION)==IDYES)){ // Usunięcie wszystkich rekordów m_pSet->MoveFirst(); while ( !m_pSet->IsEOF( ) ) { m_pSet->Delete( ); m_pSet->MoveNext(); } m_pSet->Requery(); m_count = 0; m_currRecord = 0; m_pSet->m_Id = 0; m_pSet->m_Value = 0; EnableEdit(FALSE); EnableNaviButtons(TRUE); UpdateData(FALSE); } }

1.5

OSE 31

Przykład aplikacji bazodanowej

Wygląd gotowej aplikacji

1.6