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