|
|
MS SQL adatbázis kezelés Delphi-ből
MS SQL 30. rész
|
|
Példaprogram letöltése
4934 bájt
|
Az SQL Monitor a Delphi 2.0 verziójától része a csomagnak. Segítségével nyomon követhetjük, hogy az alkalmazásunk és az SQL Server között milyen üzenetek közlekednek. Nem csak az SQL Links-en keresztüli hívásokat tudjuk így monitorozni, de bármelyik ODBC adatforrásunk kommunikációját is figyelhetjük vele. Mellékelt példában az SQL Monitorral foglalkozunk.
Használata egyszerű, a monitorozni kívánt tevékenység típusát az Options menü Trace Options pontjában állíthatjuk be. Az egyes kategóriák jelentése a következő: Amely műveleti típusokat engedélyezzük, azok a monitorozás során látszani fognak.
Prepared Query Statements: A szervernek előkészítésre elküldött utasítások. Az előkészítést a Prepare utasítással idézhetjük elő, de ha mi nem tesszük meg, a Delphi automatikusan minden, az SQL szervernek szóló utasítás előtt meghívja.
Executed Query Statements: A szervernek végrehajtásra elküldött utasítások.
Input Parameters: INSERT és UPDATE utasítások során a szervernek küldött paraméterek.
Fetched Data: A szerver felől az alkalmazásunk felé közlekedő adatok.
Statement Operations: Minden végrehajtott művelet, mint pl. az ALLOCATE, PREPARE, EXECUTE vagy a FETCH.
Connect / Disconnect: Az szerverre való fel- és lecsatlakozással kapcsolatos műveletek.
Transactions: Tranzakciós műveletek (BEGIN, COMMIT, ROLLBACK).
Blob I/O: Blob műveletek, mint pl. GET BLOB HANDLE, STORE BLOB, stb.
Miscellaneous: A korábban felsorolt kategóriákba nem tartozó, egyéb műveletek.
Vendor Errors: A szervertől visszajövő hibaüzenetek.
Ugyanezen dialógusablak Buffer fülére kattintva beállíthatjuk, hogy a memória mekkora részét akarjuk a műveletek nyomkövetésére áldozni (Buffer size). Választhatunk cirkuláris naplózást, ami azt jelenti, hogy ha a puffer betelik, akkor minden újabb sorral egy régi sor elvész. Ha ezt nem akarjuk, beállíthatjuk, hogy a puffer megtelésekor a információk a lemezegységen tárolódjanak.
Ha most egy TTable komponensen keresztül próbaképpen megnyitjuk mondjuk a pubs adatbázis sales tábláját, a Delphi a következő utasításokat küldi az SQL Server felé:
- SQL Prepare: MSSQL - select c.name, t.type, c.length, c.status, t.name, c.prec, c.scale from syscolumns c, systypes t
where c.id = object_id ('dbo.sales') and c.usertype = t.usertype order by colid ASC
- SQL Execute: MSSQL - select c.name, t.type, c.length, c.status, t.name, c.prec, c.scale from syscolumns c, systypes t
where c.id = object_id ('dbo.sales') and c.usertype = t.usertype order by colid ASC
- SQL Stmt: MSSQL - Fetch
- SQL Stmt: MSSQL - Fetch
A fetch utasítás annyiszor ismétlődik, ahány oszlopa van a sales táblának. Ha a tábla szerkezetére vonatkozó metaadatok már átjöttek, akkor átmegy a táblára vonatkozó SELECT is, és a Delphi annyi rekordot 'fetch-el' le, amennyit éppen meg kell jelenítenie.
- SQL Prepare: MSSQL - SELECT stor_id ,ord_num ,ord_date ,qty ,payterms ,title_id FROM dbo.sales ORDER BY stor_id ASC
, ord_num ASC , title_id ASC
- SQL Execute: MSSQL - SELECT stor_id ,ord_num ,ord_date ,qty ,payterms ,title_id FROM dbo.sales ORDER BY stor_id ASC
, ord_num ASC , title_id ASC
- SQL Stmt: MSSQL - Fetch
- SQL Stmt: MSSQL - Fetch
Ha mi magunk szeretnénk nyomkövetni, azt is megtehetjük. A BDE ugyanis lehetőséget biztosít arra, hogy a végrehajtott utasításokról az alkalmazásunk információt kérjen tőle, sőt ennél sokkal többet is lehetővé tesz (CallBack). A DbiRegisterCallBack utasítás segítségével az alkalmazás megmondhatja a BDE-nek, hogy a bekövetkezett eseménynek mi legyen a sorsa. Az utasítás a BDE-ben beregisztrál egy általunk megvalósított függvényt. A BDE minden adatbázis művelet végrehajtása előtt meghívja ezt a függvényt, és a függvény visszatérési értéke szerint fogja folytatni a munkáját (cbrAbort, cbrContinue, stb.) A szükséges definícióknak és paraméterezéseknek az IDAPI.H fájlban nézhetünk utána, ez a BDE interfésze a kliensek felé.
A példaprogramban egy ilyen kezdetleges nyomkövetést valósítunk meg. Írunk egy TraceCallback nevű callback függvényt, és a CreateForm metódusban a DbiRegisterCallBack utasítás hívásával közöljük a BDE-vel, hogy létezik egy ilyen függvény. Meg kell adnunk a callback típusát, a kommunikációhoz használt adatszerkezetre mutató pointer értéket, a callback puffer méretét, a callback pufferre mutató pointert és a callback függvény címét.
DbiRegisterCallback(nil, cbTrace, Longint(@OldCallbackInfo), SizeOf(TraceInfo), @TraceInfo, @TraceCallback);
A puffer terület neve TraceInfo, szerkezete a következő:
TTraceDesc = packed record
Category: TraceCat;
TotalMsgLen: Word;
Msg: array[ 0..DBIMaxTraceLen ] of Char;
end;
A kommunikációhoz a következő struktúrát kell létrehoznunk:
PDbiCallbackInfo = ^TDbiCallbackInfo;
TDbiCallbackInfo = record
CallbackType: CBType;
ClientData: Longint;
DataBuffLen: Word;
DataBuff: pCBPROGRESSDesc;
DbiCallbackFcn: Pointer;
end;
Hogy mely adatbázisműveleteket akarjuk monitorozni, azt a Session globális változó TraceFlags property-jében tudjuk beállítani. Ez alapértelmezés szerint üres halmaz, tehát nekünk mindenképpen be kell állítanunk, ha a monitorozás során látni is szeretnénk valamit.
Session.TraceFlags := [tfConnect, tfQPrepare, tfQExecute, tfError, tfStmt, tfDataIn, tfDataOut];
Ha az itt beállított típusoknak megfelelő utasítást kell a BDE-nek végrehajtania, hívni fogja a mi callback függvényünket, amiben gyakorlatilag nem teszünk mást, mint az AddMessage metódus hívásával a ListBoxba írjuk az üzenet kategóriáját és szövegét.
A programot egy nagyon egyszerű adatbázisművelet-sorral teszteljük: megnyitjuk az adatbáziskapcsolatot, megnyitunk egy táblát egy TQuery komponensen keresztül, majd bezárjuk a táblát is és a kapcsolatot is.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 291. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|