Delphi - MS SQL adatbázis kezelés Delphi-ből

MS SQL 30. rész

forráskód letöltése
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.

MS SQL cikksorozat

MS SQL adatbázis kezelés Delphi-ből - 1. rész
MS SQL adatbázis kezelés Delphi-ből - 2. rész
MS SQL adatbázis kezelés Delphi-ből - 3. rész
MS SQL adatbázis kezelés Delphi-ből - 4. rész
MS SQL adatbázis kezelés Delphi-ből - 5. rész
MS SQL adatbázis kezelés Delphi-ből - 6. rész
MS SQL adatbázis kezelés Delphi-ből - 7. rész
MS SQL adatbázis kezelés Delphi-ből - 8. rész
MS SQL adatbázis kezelés Delphi-ből - 9. rész
MS SQL adatbázis kezelés Delphi-ből - 10. rész
MS SQL adatbázis kezelés Delphi-ből - 11. rész
MS SQL adatbázis kezelés Delphi-ből - 12. rész
MS SQL adatbázis kezelés Delphi-ből - 13. rész
MS SQL adatbázis kezelés Delphi-ből - 14. rész
MS SQL adatbázis kezelés Delphi-ből - 15. rész
MS SQL adatbázis kezelés Delphi-ből - 16. rész
MS SQL adatbázis kezelés Delphi-ből - 17. rész
MS SQL adatbázis kezelés Delphi-ből - 18. rész
MS SQL adatbázis kezelés Delphi-ből - 19. rész
MS SQL adatbázis kezelés Delphi-ből - 20. rész
MS SQL adatbázis kezelés Delphi-ből - 21. rész
MS SQL adatbázis kezelés Delphi-ből - 22. rész
MS SQL adatbázis kezelés Delphi-ből - 23. rész
MS SQL adatbázis kezelés Delphi-ből - 24. rész
MS SQL adatbázis kezelés Delphi-ből - 25. rész
MS SQL adatbázis kezelés Delphi-ből - 26. rész
MS SQL adatbázis kezelés Delphi-ből - MS SQL 27. rész
MS SQL adatbázis kezelés Delphi-ből - MS SQL 28. rész
MS SQL adatbázis kezelés Delphi-ből - MS SQL 29. rész

MS SQL adatbázis kezelés Delphi-ből - MS SQL 30. rész

MS SQL adatbázis kezelés Delphi-ből - MS SQL 31. rész
MS SQL adatbázis kezelés Delphi-ből - MS SQL 32. rész