Adatbázis-kezelés API hívásokkal Alkalmazás Adatbázis1 API1
API1 hívások
Adatbázis-kezelés ODBC-vel
Alkalmazás
Készítette: Szabóné Nacsa Rozália Adatbázis2
2004. november
Adatbázis-kezelés SQL parancsokkal
API2
API2 hívások
Adatbázis-kezelés ODBC-vel SQL
Adatbázis1 API1
Adatbázis1 SQL Alkalmazás
API2
Adatbázis2 API1
Adatbázis-kezelés ODBC-vel
ODBC driver1
ODBC eljárások ODBC driver2
ODBC architektúra „Access” driver
SQL
Driver (meghajtó) „MySQL” driver
ODBC API1 eljárások ODBC driver1
SQL parancsok
SQL
SQL
Adatbázis1
Alkalmazás
ODBC eljáráshívások
SQL parancsok
Adatbázis2
ODBC API1 eljárások ODBC driver1
DSN (adatforrás) Elemi alkalmazások fejlesztése adatbázis
Alkalmazás SQL parancsok
Adatbázis1
ODBC eljáráshívások
A program indításakor a driver manager beolvassa az adatforrás adatait és betölti a drivert.
Alkalmazás CDataBase példány
SQL Adatbázis2
ODBC API1 eljárások ODBC driver2
driver1
ODBC driver2
Függvényhívások
CRecordSet példány
driver2 Adatbázis2
1
Adatbázis regisztráció Driver (meghajtó) „MySQL” driver
DSN (adatforrás) Elemi alkalmazások fejlesztése
eaf
ı
Vezérl pult/Felügyeleti eszközök Driver (meghajtó) „Access” driver
DSN (adatforrás) Elemi alkalmazások fejlesztése
A driverek és az adatbázis összerendelése: REGISZTRÁCIÓ
EAF
ODBC adatforrás
2
Alkalmazás készítése tündérrel
Alkalmazás tündér - 1
Alkalmazás tündér - 2
Alkalmazás tündér - 3
Alkalmazás tündér - 4
Alkalmazás tündér - 5
A MySQL nem támogatja a „Dynaset” opciót.
3
Alkalmazás tündér - 6
Fordítás
Futtatás
A projekt felépítése - osztályszerkezet (részlet) CRecordView
CRecordSet m_strSort m_strFilter
Adatbázis navigáló eszközök
OnMove()
Open() MoveFirst() MoveNext() isEOF() Update() ...
CEefView m_pSet
CRecordSet objektumra mutató pointer
CEafSet m_diak_id m_azon m_nev
Ő
rlap megtervezése
IDC_DIAK_ID
Adatkezelés
IDC_AZON IDC_NEV
4
Vezérl k és adattagok összekapcsolása
Vezérl k és adattagok összekapcsolása
ı
ı
Dupla kattintással
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.
Open() MoveFirst() MoveNext() isEOF() Update() ...
Adatbázis
CEafSet ODBC driver DoFieldExchange
CRecordView
CEafView m_pSet
CRecordSet objektumra mutató pointer
DoDataExchange
m_diak_id m_azon m_nev
A View osztályból a RecordSet tagfüggvényeit az m_pSet mutatón keresztül érjük el. Pl.: m_pSet->MoveFirst();
OnMove()
UpdateData(TRUE)
UpdateData(FALSE)
CRecordSet m_strSort m_strFilter
A Recordset és a RecordView kapcsolata - 2
Dialógus ablak
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
UpdateData(FALSE)
A Recordset és a RecordView kapcsolata - 1
Dialógus ablak
DoDataExchange
m_diak_id m_azon m_nev
UpdateData(TRUE)
5
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 Illesszük be projektünkbe a „Rendezés” menüpontot!
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.
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 } ı
ı
6
Rekordok szerkesztése
OnMove() { ... UpdateData(TRUE); ... }
CRecordView OnMove()
Move() { ... DoFieldExchange //makró ... }
CEafView m_pSet
Ha a vezérl k megváltoznak, a virtuális OnMOve() végrehajtódik. ı
A módosítás akkor kerül be az adatbázisba, amikor „lelépünk” a rekordról.
Rekord módosítása - 1
CEafSet ODBC driver DoFieldExchange
CRecordView
CRecordSet m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() Move() 3 ...
m_diak_id m_azon m_name
1
OnMove()
CEafView Dialógus ablak
m_pSet
CRecordSet objektumra mutató pointer
2
UpdateData(TRUE)
4
Rekord módosítása - 2
OnMove() { ... UpdateData(TRUE); ... }
Read only
m_strSort m_strFilter Open() MoveFirst() MoveNext() isEOF() Update() Move() ...
Move() { ... DoFieldExchange //makró ... }
Rekord beszúrása - 1
CRecordView
CRecordSet
OnMove()
CEafView Dialógus ablak
m_pSet
CEafSet ODBC driver
m_diak_id m_azon m_name
DoFieldExchange
1. Létrehoz egy üres rekordot a RecordSet-ben. 2. Frissíti az adatforrást. 3. Frissíti a vezérl ket.
CRecordSet
Rekord beszúrása - 2
m_strSort m_strFilter
Read only
Rekord beszúrása – „read only” mez k kezelése - 1 ı
CRecordView
ı
x y z 1 23 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
1
Read only
OnMove()
CPeopleView m_pSet
Dialógus ablak
onRecordAdd()
Új rekord beszúrásakor a dialógus ablakban a „read only” státuszt fel kell oldani.
3 UpdateData(FALSE)
7
Rekord beszúrása – „read only” mez k kezelése - 2
CRecordSet
Rekord beszúrása – „read only” mez k kezelése - 3 ı
m_strSort m_strFilter
ı
x y z 1 23
Bevezetünk egy új adattagot, amellyel azt jelezzük, hogy éppen melyik OnMove()-ot kell végrehajtani.
CRecordView 1
OnMove()
Open() MoveFirst() MoveNext() isEOF() Update() Move() AddNew() ...
2
CPeopleView m_pSet m_AddingRecord OnRecordAdd() OnMove()
Dialógus ablak
3
CPeopleSet ODBC driver
Read only
m_diak_id m_azon m_nev
UpdateData(FALSE)
CEafView::CEafView() : CRecordView(CEafView::IDD) { //{{AFX_DATA_INIT(CEafView) m_pSet = NULL; //}}AFX_DATA_INIT // TODO: add construction code here m_AddingRecord = FALSE; }
DoFieldExchange
Rekord beszúrása – „read only” mez k kezelése - 4 ı
EafView::OnMove() – 1
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() – 2
Fordítás/Futtatás
BOOL CEafView::OnMove(UINT nIDMoveCommand) { if (m_AddingRecord) { m_AddingRecord = FALSE; UpdateData(TRUE); //vezérl k -> recordset if(m_pSet->CanUpdate()) m_pSet->Update(); //Adatbázis frissítése m_pSet->Requery(); //adatbázis -> recordset UpdateData(FALSE); //recordset -> vezérl k ı
Beszúrásnál megadhatunk egy kódot.
Egyéb esetekben a kód mez csak olvasható. ı
ı
//"read only" visszaállítása CEdit* pCtrl = (CEdit*)GetDlgItem(IDC_DIAK_ID); pCtrl->SetReadOnly(TRUE); return TRUE; } else { return CRecordView::OnMove(nIDMoveCommand); } }
8
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);
A munkafüzetben bemutatott projekt letölthet a people.inf.elte.hu/nacsa/eaf/eaf4/projects/eafadmin_odbc címr l. ı
UpdateData(FALSE);
ı
}
9