Adatbázis-kezelés ODBC-vel
Készítette: Szabóné Nacsa Rozália 2004. november
Adatbázis-kezelés API hívásokkal Alkalmazás Adatbázis1 API1
API1 hívások
Alkalmazás Adatbázis2
API2
API2 hívások
Adatbázis-kezelés SQL parancsokkal
Adatbázis1 API1 SQL Alkalmazás
SQL parancsok
Adatbázis2
API2 SQL
Adatbázis-kezelés ODBC-vel SQL Adatbázis1 API1
ODBC eljárások ODBC driver1
Alkalmazás SQL parancsok ODBC eljáráshívások
SQL
Adatbázis2 API1
ODBC eljárások ODBC driver2
ODBC driver1
Adatbázis-kezelés ODBC-vel SQL Adatbázis1 API1
ODBC eljárások ODBC driver1
Alkalmazás SQL parancsok ODBC eljáráshívások
SQL Adatbázis2 API1
ODBC eljárások ODBC driver2
ODBC driver2
ODBC architektúra „Access” driver
Driver (meghajtó) „MySQL” driver
Adatbázis1
Elemi alkalmazások fejlesztése adatbázis
A program indításakor a driver manager beolvassa az adatforrás adatait és betölti a drivert.
driver1
driver2 Adatbázis2
DSN (adatforrás)
Alkalmazás CDataBase példány CRecordSet példány
Függvényhívások
Adatbázis regisztráció Driver (meghajtó) „MySQL” driver
DSN (adatforrás) Elemi alkalmazások fejlesztése
eaf
Driver (meghajtó) „Access” driver
EAF
DSN (adatforrás) Elemi alkalmazások fejlesztése
Vezérl pult/Felügyeleti eszközök
A driverek és az adatbázis összerendelése: REGISZTRÁCIÓ
ODBC adatforrás
Alkalmazás készítése tündérrel
Alkalmazás tündér - 1
Alkalmazás tündér - 2
A MySQL nem támogatja a „Dynaset” opciót.
Alkalmazás tündér - 3
Alkalmazás tündér - 4
Alkalmazás tündér - 5
Alkalmazás tündér - 6
Fordítás
Futtatás Adatbázis navigáló eszközök
A projekt felépítése - osztályszerkezet (részlet) CRecordSet m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() ...
CEafSet m_diak_id m_azon m_nev
CRecordView OnMove()
CEefView m_pSet
CRecordSet objektumra mutató pointer
Adatkezelés
rlap megtervezése
IDC_DIAK_ID IDC_AZON IDC_NEV
Vezérl k és adattagok összekapcsolása
Dupla kattintással
Vezérl k és adattagok összekapcsolása
Vezérl k és adattagok összekapcsolása
Fordítás/Futtatás
Eddig még egy sor kódot sem írtunk, de már böngészhetünk az adatbázisunkon.
A Recordset és a RecordView kapcsolata - 1
m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() ...
Adatbázis
CEafSet ODBC driver DoFieldExchange
CRecordView OnMove()
CEafView m_pSet
CRecordSet objektumra mutató pointer
DoDataExchange
m_diak_id m_azon m_nev
UpdateData(TRUE)
UpdateData(FALSE)
CRecordSet
Dialógus ablak
A Recordset és a RecordView kapcsolata - 2
Adatbázis
CRecordSet m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() ...
CEafSet ODBC driver DoFieldExchange
CRecordView OnMove()
CEafView m_pSet
CRecordSet objektumra mutató pointer
DoDataExchange
m_diak_id m_azon m_nev
UpdateData(TRUE)
UpdateData(FALSE)
A View osztályból a RecordSet tagfüggvényeit az m_pSet mutatón keresztül érjük el. Pl.: m_pSet->MoveFirst();
Dialógus ablak
RecordSet: Sz rés, rendezés CRecordSet::m_strSort: CRecordSet::m_strFilter:
az SQL parancs ORDER BY klauzúlája az SQL parancs WHERE klauzúlája
Select * from diak order by azon ASC; m_strSort = „azon” Select * from diak order by diak_id DESC; m_strSort = „diak_id DESC”
Az új beállítások érvényesítéséhez meg kell hívni az Open() vagy a Requery() tagfüggvényeket.
Illesszük be projektünkbe a „Rendezés” menüpontot!
Sz rés, rendezés: menüpontok
Rendezés - 1
Rendezés - 2 void CEafView::OnSortAzon() { m_pSet->Close(); m_pSet->m_strSort = "azon"; m_pSet->Open(); UpdateData(FALSE); }
//Új record set feltöltése az adatbázisból //Vezérl k frissítése a record setb l
void CEafView::OnSortDiakId() { m_pSet->m_strSort = "diak_id"; m_pSet->Requery(); //Nyitott record set frissítése az adatbázisból UpdateData(FALSE); //Vezérl k frissítése a recordsetb l }
Rekordok szerkesztése CRecordView OnMove()
CEafView m_pSet
A módosítás akkor kerül be az adatbázisba, amikor „lelépünk” a rekordról.
Ha a vezérl k megváltoznak, a virtuális OnMOve() végrehajtódik.
OnMove() { ... UpdateData(TRUE); ... } Move() { ... DoFieldExchange //makró ... }
Rekord módosítása - 1
m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() Move() 3 ...
CEafSet ODBC driver DoFieldExchange
4
CRecordView
CRecordSet
m_diak_id m_azon m_name
1
OnMove()
CEafView Dialógus ablak
m_pSet
CRecordSet objektumra mutató pointer
UpdateData(TRUE)
2
OnMove() { ... UpdateData(TRUE); ... } Move() { ... DoFieldExchange //makró ... }
Rekord módosítása - 2 Read only CRecordSet m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() Move() ...
CEafSet ODBC driver DoFieldExchange
m_diak_id m_azon m_name
CRecordView OnMove()
CEafView m_pSet
Dialógus ablak
Rekord beszúrása - 1
1. Létrehoz egy üres rekordot a RecordSet-ben. 2. Frissíti az adatforrást. 3. Frissíti a vezérl ket.
Rekord beszúrása - 2
CRecordSet m_strSort m_strFilter
x y z 123 void CPeopleView::OnRecordAdd() { m_pSet->AddNew(); m_pSet->Update(); UpdateData(FALSE);. }
2
Open() MoveFirst() MoveNext() isEOF() Update() Move() AddNew() ...
CPeopleSet ODBC driver
DoFieldExchange
m_diak_id m_azon m_nev
Read only
CRecordView 1
OnMove()
CPeopleView m_pSet
Dialógus ablak
onRecordAdd()
3 UpdateData(FALSE)
Rekord beszúrása – „read only” mez k kezelése - 1 Read only
Új rekord beszúrásakor a dialógus ablakban a „read only” státuszt fel kell oldani.
Rekord beszúrása – „read only” mez k kezelése - 2
CRecordSet m_strSort m_strFilter
x y z 123
Bevezetünk egy új adattagot, amellyel azt jelezzük, hogy éppen melyik OnMove()-ot kell végrehajtani.
2
Open() MoveFirst() MoveNext() isEOF() Update() Move() AddNew() ...
CPeopleSet ODBC driver
DoFieldExchange
m_diak_id m_azon m_nev
CRecordView 1
Read only
OnMove()
CPeopleView m_pSet m_AddingRecord OnRecordAdd() OnMove()
3
UpdateData(FALSE)
Dialógus ablak
Rekord beszúrása – „read only” mez k kezelése - 3
CEafView::CEafView() : CRecordView(CEafView::IDD) { //{{AFX_DATA_INIT(CEafView) m_pSet = NULL; //}}AFX_DATA_INIT // TODO: add construction code here m_AddingRecord = FALSE; }
Rekord beszúrása – „read only” mez k kezelése - 4
void CEafView::OnRecordAdd() { //Létrehoz egy üres rekordot a recordset-ben m_pSet->AddNew(); //"read only" vezérl k "engedélyezése" mAddingRecord = TRUE; CEdit* pCtrl = (CEdit*)GetDlgItem (IDC_DIAK_ID); int result = pCtrl->SetReadOnly(FALSE); //Az aktuális rekord (üres) adatainak átmásolása a recordset-be. UpdateData(FALSE); }
EafView::OnMove() – 1
EafView::OnMove() – 2 BOOL CEafView::OnMove(UINT nIDMoveCommand) { if (m_AddingRecord) { m_AddingRecord = FALSE; //vezérl k -> recordset UpdateData(TRUE); if(m_pSet->CanUpdate()) m_pSet->Update(); //Adatbázis frissítése m_pSet->Requery(); //adatbázis -> recordset UpdateData(FALSE); //recordset -> vezérl k //"read only" visszaállítása CEdit* pCtrl = (CEdit*)GetDlgItem(IDC_DIAK_ID); pCtrl->SetReadOnly(TRUE); return TRUE; } else { return CRecordView::OnMove(nIDMoveCommand); } }
Fordítás/Futtatás
Beszúrásnál megadhatunk egy kódot.
Egyéb esetekben a kód mez csak olvasható.
Rekord törlése - 1
Rekord törlése - 2
Rekord törlése - 3
void CEafView::OnRecordDelete() { m_pSet->Delete(); m_pSet->MoveNext();
//Töröljük az aktuális rekordot //Ráállunk a következ rekordra, ha van ilyen
if (m_pSet->IsEOF()) m_pSet->MoveLast(); if (m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL); UpdateData(FALSE); }
A munkafüzetben bemutatott projekt letölthet a people.inf.elte.hu/nacsa/eaf/eaf4/projects/eafadmin_odbc címr l.