AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Speicherüberlauf des MS SQL-Servers bei ADO-Verbindung
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von windi · begonnen am 25. Nov 2009 · letzter Beitrag vom 28. Nov 2009
 
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, 15: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz