written by T. Schmidt

Direkter Zugriff auf Datenbankschnittstellen


 

Der direkte Zugriff auf Datenbanken über die bereitgestellten Methodenaufrufe der Datenbankschnittstelle (Treiber) ist mit erheblichem Programmieraufwand verbunden. Für einige Anwendungsfälle lässt dieser sich aber nicht umgehen. So ist zum Beispiel die nachträgliche Integration kryptographischer Datenbankerweiterungen in Anwendungen oder ein Realtimezugriff auf Datenbanken solch ein Anwendungsgebiet.

Die von Borland mitgelieferte Datenbankschnittstelle Borland Database Engine oder kurz BDE ermöglicht fast jede Art der Datenmanipulation der zugeordneten Datenbank. Derartige Zugriffe erfolgen wesentlich schneller als implementierte Methoden der VCL da der gesamte Eventmechanismus umgangen wird. Durch den fehlenden Eventmechanismus sollten Direktzugriffe auf Datenbanken nur für Datenmanipulation oder deren Bereitstellung, nicht aber für visuelle Datenbankkomponenten verwendet werden.

Im folgenden wird ein kleines Beispiel erläutert wie ein direkter Zugriff erfolgen kann. Eine wichtige Eigenschaft einer Datenbankdatei, welche für fast sämtliche Methodenaufrufe der BDE erforderlich ist, der Datenbankcursor, erhält man mit TempCursor:= TTable.Handle. Soll auf Daten unabhängig vom Handle des Table zugegriffen werden, kann man mit der BDE Funktion DbiCloneCursor (hCurSrc: hDBICur; bReadOnly: Bool; bUniDirectional: Bool; var hCurNew: hDBICur) einen neuen Cursor erzeugen. In (Beispiel 1) wird ein solcher erzeugt und das Table auf den ersten Datensatz der Datenbankdatei gesetzt. Der geklonte Cursor erhält den gleichen Range, den Index, den Share Mode,die Position, FieldMaps und Filter des Quellcursor. Diese geerbten Eigenschaften sind nachträglich ohne Einfluss auf den Quellcursor veränderbar. Um die Kursoreigenschaften abzufragen bedient man sich der wie in Beispiel 2 dargestellten BDE Funktion. Die Cursoreigenschaften sind für einige andere Funktionsaufrufe notwendig.

Die Funktionsaufrufe der BDE erfolgen ohne Exceptionmechanismus. Auftretende Fehler sollten deshalb mit der Funktion Check() abgefangen werden, um über try  except Blöcke darauf reagieren zu können. Abschließend folgt ein Beispiel, wie mit Hilfe der BDE ein Datensatz eines Table gesucht werden kann.

 


 

Beispiel 1. DbiCloneCursor

var NewCurs: hDBICur;

function fDbiCloneCursor(SourceCurs: hDBICur): hDBICurs;
begin
  
Check(DbiCloneCursor (Source, False, False, Result));
  Check(DbiSetToBegin(Result));
  Check(DbiGetNextRecord(Result, dbiNOLOCK, nil, nil));
end;

Beispiel 2. Kursoreigenschaften

function fDbiGetCursProps(hCur: hDBICur): CURProps;
begin
  Check(DbiGetCursorProps(hCur, Result));
end;

Beispiel 3. DatensatzSuche

function fDbiSetToKey(hCur: hDBICur; RecBuf: PByte; FieldNo: Integer; key: PChar): Longint;
var  RecProp: RecProps;
begin
  Check(DbiInitRecord(hCur, RecBuf));
  Check(DbiPutField(hCur, FieldNo, RecBuf, key));
  Check(DbiSetToKey(hCur, keySEARCHEQ, false, 0, 0, RecBuf));
  Check(DbiGetNextRecord(hCur, dbiNoLock, RecBuf, @RecProp));
  Result := RecProp.iSeqNum;
end;

var CurProp: CurProps; RecBuf: PChar; RecordNr: LongInt; 

begin
  NewCurs:= fDbiCloneCursor(Table1.Handle);
  CurProp:= fDbiGetCursProps(NewCurs);
  RecBuf := AllocMem(CurProp.iRecBufSize*SizeOf(Byte));
  try
  
RecordNr:= fDbiSetToKey(NewCurs, RecBuf, 1, '1999,99');
  with RecBuf do ...
  finally  FreeMem(RecBuf, CurProp.iRecBufSize*SizeOf(Byte)); end;
end;


 

Microsoft ©  und Borland © sind eingetragene Warenzeichen.