Die Datenbankverbindung wird über folgende Funktion geöffnet:
Delphi-Quellcode:
function TADODatabase.OpenDatabase: Boolean;
begin
Result := True;
try
ADOConnection.Open;
if (Assigned(OnDBConnection))
then
OnDBConnection(csCONNECTED);
except
on E:
Exception do
begin
Result := False;
ShowErrorMessage('
Fehler beim Verbindungsaufbau mit "' + ConnectionString + '
"! Grund: ' + E.
Message);
end;
end;
end;
... und wieder geschlossen:
Delphi-Quellcode:
function TADODatabase.CloseDatabase: Boolean;
begin
Result := True;
try
if (ADOQuery.Active)
then
ADOQuery.Active := False;
ADOConnection.Close;
if (Assigned(OnDBConnection))
then
OnDBConnection(csDISCONNECTED);
except
on E:
Exception do
begin
Result := False;
ShowErrorMessage('
Fehler beim Verbindungsabbau mit der Datenbank! Grund: ' + E.
Message);
end;
end;
end;
Eine Abfrage erfolgt im Programm über:
Delphi-Quellcode:
try
FBDE_DB.DoSelectQuery('SELECT * FROM [dbo].[PQ25Parts_T] WHERE [TeileID]=' + IntToStr(FLastReadedMessage.TeileID));
// ... mach irgendwas damit ...
finally
FBDE_DB.CloseQuery;
end;
Die Funktion DoSelectQuery sieht so aus:
Delphi-Quellcode:
function TADODatabase.DoSelectQuery(
Query:
String): Boolean;
var StartTime: Double;
begin
if (ADOConnection.Connected)
then
begin
StartTime := Now;
try
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add(
Query);
ADOQuery.Open;
ADOQuery.First;
Result := True;
except
on E:
Exception do
begin
ShowErrorMessage('
SQL Fehler in: "' +
Query + '
" auf ' + ServerName
+ '
Grund: ' + IntToStr(E.HelpContext) + '
"' + E.
Message + '
"');
Result := False;
end;
end;
if (FUseQueryActivityTimer)
then
FQueryActivity.NewQueryExecution(
Query, Now - StartTime);
end
else
Result := False;
end;
Die Funktion CloseQuery sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TADODatabase.CloseQuery;
begin
if (ADOQuery.Active) then
ADOQuery.Close;
end;
Die Funktionen DoSelectQuery und CloseQuery sind in einem Datenmodul angelegt, welches eine TADOConnection- und eine TADOQuery-Komponente enthält.
Was ist der Vorteil, wenn ich einen UDL-Thread verwende bzw. wie geht sowas? Ich verwende derzeit einen Arbeitsthread, der neue Meldungen von der Anlage entgegennimmt und entsprechend Querys an die Datenbank sendet. Die Vorgehensweise verwende ich so nun schon im vierten Projekt mit unterschiedlichsten Datenbanken. Leider hatte ich es bis jetzt noch nie mit derartigen Problemen zu kämpfen (aber auch noch nie mit solchen Datenmengen).