Einzelnen Beitrag anzeigen

windi

Registriert seit: 22. Dez 2004
Ort: Chemnitz
21 Beiträge
 
RAD-Studio 2010 Arc
 
#10

Re: Speicherüberlauf des MS SQL-Servers bei ADO-Verbindung

  Alt 26. Nov 2009, 16:44
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).
  Mit Zitat antworten Zitat