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ázis 1 API 1 API 1 hívások Adatbázis 2 API 2 Alkalmazás API 2 hívások
Adatbázis-kezelés SQL parancsokkal Adatbázis 1 API 1 SQL Alkalmazás Adatbázis 2 API 2 SQL parancsok SQL
Adatbázis-kezelés ODBC-vel SQL Adatbázis 1 API 1 ODBC eljárások ODBC driver 1 Alkalmazás SQL parancsok SQL ODBC eljáráshívások Adatbázis 2 API 1 ODBC eljárások ODBC driver 2 ODBC driver 1
Adatbázis-kezelés ODBC-vel SQL Adatbázis 1 API 1 ODBC eljárások ODBC driver 1 Alkalmazás SQL parancsok SQL ODBC eljáráshívások Adatbázis 2 API 1 ODBC eljárások ODBC driver 2 ODBC driver 2
ODBC architektúra Access driver Driver (meghajtó) MySQL driver DSN (adatforrás) Elemi alkalmazások fejlesztése adatbázis Adatbázis 1 A program indításakor a driver manager beolvassa az adatforrás adatait és betölti a drivert. driver 1 CDataBase példány CRecordSet példány Alkalmazás Függvényhívások Adatbázis 2 driver 2
Adatbázis regisztráció Driver (meghajtó) MySQL driver DSN (adatforrás) Elemi alkalmazások fejlesztése eaf Driver (meghajtó) Access driver DSN (adatforrás) Elemi alkalmazások fejlesztése EAF
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
A MySQL nem támogatja a Dynaset opciót. Alkalmazás tündér - 2
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()... CRecordView OnMove() CEefView m_pset CEafSet CRecordSet objektumra mutató pointer m_diak_id m_azon m_nev
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 CRecordSet m_strsort m_strfilter CRecordView OnMove() Adatbázis ODBC driver DoFieldExchange Open() MoveFirst() MoveNext() iseof() Update()... CEafSet m_diak_id m_azon m_nev CEafView m_pset CRecordSet objektumra mutató pointer UpdateData(TRUE) DoDataExchange UpdateData(FALSE) Dialógus ablak
A Recordset és a RecordView kapcsolata - 2 A View osztályból a RecordSet tagfüggvényeit az m_pset mutatón keresztül érjük el. Pl.: m_pset->movefirst(); Adatbázis ODBC driver DoFieldExchange CRecordSet m_strsort m_strfilter Open() MoveFirst() MoveNext() iseof() Update()... CEafSet m_diak_id m_azon m_nev CRecordView OnMove() CEafView m_pset CRecordSet objektumra mutató pointer UpdateData(TRUE) DoDataExchange UpdateData(FALSE) 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.
Sz rés, rendezés: menüpontok Illesszük be projektünkbe a Rendezés menüpontot!
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(); UpdateData(FALSE); } //Nyitott record set frissítése az adatbázisból //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);... } Rekord módosítása - 1 CRecordSet m_strsort m_strfilter CRecordView OnMove() Move() { Open()... MoveFirst() DoFieldExchange //makró MoveNext()... iseof() CEafView } Update() Dialógus m_pset Move() 3 ablak... 1 ODBC driver DoFieldExchange 4 CEafSet m_diak_id m_azon m_name CRecordSet objektumra mutató pointer UpdateData(TRUE) 2
OnMove() {... UpdateData(TRUE);... } Move() {... DoFieldExchange //makró... } Rekord módosítása - 2 CRecordSet m_strsort m_strfilter Open() MoveFirst() MoveNext() iseof() Update() Move()... CRecordView OnMove() CEafView m_pset Read only Dialógus ablak ODBC driver DoFieldExchange CEafSet m_diak_id m_azon m_name
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. CRecordSet m_strsort m_strfilter x y z 1 2 3 1 Rekord beszúrása - 2 Read only CRecordView OnMove() void CPeopleView::OnRecordAdd() { m_pset->addnew(); m_pset->update(); UpdateData(FALSE);. } 2 Open() MoveFirst() MoveNext() iseof() Update() Move() AddNew()... CPeopleView m_pset onrecordadd() Dialógus ablak ODBC driver DoFieldExchange CPeopleSet m_diak_id m_azon m_nev 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 CRecordView Read only Bevezetünk egy új adattagot, amellyel azt jelezzük, hogy éppen melyik OnMove()-ot kell végrehajtani. 2 x y z 1 2 3 Open() MoveFirst() MoveNext() iseof() Update() Move() AddNew()... 1 OnMove() CPeopleView m_pset m_addingrecord OnRecordAdd() OnMove() Dialógus ablak ODBC driver DoFieldExchange CPeopleSet m_diak_id m_azon m_nev 3 UpdateData(FALSE)
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; 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 } } else { } //"read only" visszaállítása CEdit* pctrl = (CEdit*)GetDlgItem(IDC_DIAK_ID); pctrl->setreadonly(true); return TRUE; 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.