Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Anwendung friert bei SQL ein (https://www.delphipraxis.net/44028-anwendung-friert-bei-sql-ein.html)

schuetze09 12. Apr 2005 11:06

Datenbank: Oracle • Version: 9i • Zugriff über: ADO

Anwendung friert bei SQL ein
 
Hallo,

ich habe mir ein kleines Programm gebastelt, mit dem ich SQL-Abfragen auf eine Datanbank absetzen kann. Nun ist mir aufgefallen, wenn eine Abfrage länger dauert und ich in der zwischenzeit mit einem anderen Programm arbeite und dann wieder in mein Abfrageprogramm springe um nachzuschauen, ob das SQL fertig ist, dass sich das Programm scheinbar aufgehangen hat. Es läßt sich erst wieder anzeigen, wenn mein SQL fertig ist.

Kennt jemand das Problem?
Hat jemand eine Lösung dazu?

MfG
schuetze09

Jasocul 12. Apr 2005 11:27

Re: Anwendung friert bei SQL ein
 
Bekanntes Phänomen. Ist nur über Threads zu lösen.

Lemmy 12. Apr 2005 11:34

Re: Anwendung friert bei SQL ein
 
Hi,

ist nicht nur über Threads zu lösen, sondern unter Umständen mit einem gute SQL-Statement ;-))

Lemmy

schuetze09 12. Apr 2005 11:42

Re: Anwendung friert bei SQL ein
 
@Jasocul: und wie mache ich das?

@Lemmy: :? die SQL-Statement gebe ich aber erst in einem Synedit ein, dass heißt es sind keine vorgefertigten und optimierte.

Jasocul 12. Apr 2005 11:52

Re: Anwendung friert bei SQL ein
 
Ich bin leider nicht der Thread-Spezi, auch wenn ich die eine oder andere Kleinigkeit damit schon gemacht habe. Aber schau mal unter den Tutorials oder auf Luckies Homepage. Dort sollte auf jeden Fall etwas zu finden sein.

schuetze09 12. Apr 2005 11:58

Re: Anwendung friert bei SQL ein
 
@Jasocul: Danke, werde mal schauen.

Ansonsten sind weitere Tipps gern willkommen!

MfG
schuetze09

Lemmy 12. Apr 2005 17:09

Re: Anwendung friert bei SQL ein
 
Hi,

darum geht es nicht. Das Problem ist, dass viele, die von einer Desktop-Datenbank zu nem SQL-Server wechseln nciht verstehen, dass sie dabei die Art der Entwicklung umstellen müssen.

Beispiel:
War es unter einer Desktop-Datenbank ohne Probleme möglich mittels einer TTable-Komponente oder einer Query (Select * from Tabelle order by 1) durch den kompletten Datenbestand zu "zappen", ist das bei nem SQL-Server der sichere Tod! Bei 10 oder 100 Datensätze spielt das noch keine Rolle, im "Endausbau" beim Kunden kann so eine SQL mal schnell einige Sekunden/Minuten dauern, bis alle Daten einer Tabelle übers Netz auf den Client geschaufelt sind.


Aus diesem Grund ist es eigentlich nicht möglich eine konrete Aussage zu treffen. Kannst Du was zur SQL-Anweisung sagen, die so lange dauert? Was macht die?

Evtl. ist es auch möglich bei Oracle die Arbeit in eine StoredProcedure zu verlagern, so dass keinerlei Daten mehr übers Netz gezogen werden müssen. Kommt aber wie gesagt auf den Einsatzzweck an.

Lemmy

P.S: Unter den Demos von Delphi gibts ein Thread-Demo. Schau Dir das mal an, zudem die Hilfe, dann sollte das mit dem Thread auch klappen. Das wirklich komplizierte beim Thread ist vor allem die Synchronisation zwischen THread und Hauptanwendung, was bei DIr allerdings maximal ne Integerzahl für ne ProgressBar o.ä. sein sollte...

Lemmy

schuetze09 12. Apr 2005 18:10

Re: Anwendung friert bei SQL ein
 
@Lemmy:
Die SQL-Anweisung, die über eine komplette Tabelle läuft (select distinct xx, yy form xxyy).
Das Phänomen trat eben erst bei dieser Abfrage auf, da die Tabelle mehrere Mio's an Datensätzen hat. Die Ergebnissmenge wurde aber eben so benötigt. Hätte ich die Abfrage nicht so gestellt, hätte ich mein Problem wahrscheinlich erst viel später mitbekommen.


MfG
schuetze09

Lemmy 13. Apr 2005 06:43

Re: Anwendung friert bei SQL ein
 
Guten Morgen,

dann habe ich ja gleich richtig geraten..... Weshalb brauchst Du die Ergebnismenge im Client? Kannst Du mir über die Applikation mehr Angaben machen? Wenn es öffentlich ein Problem ist, dann per Mail oder PN...

Lemmy

Jasocul 13. Apr 2005 08:06

Re: Anwendung friert bei SQL ein
 
@Lemmy:
Ich antworte schonmal für schuetze09. Es geht um ein Programm, wo der Anwender sein SQL-Statement selbst eingeben kann. Einige Dinge sind vorgefertigt andere nicht. Es ist also für den Programmierer nicht möglich, etwas im Voraus zu optimieren.
Daher meine Anregung, die Abfragen in einen Thread zu packen, damit man sogenannte Long-Running-Queries abbrechen kann.

schuetze09 13. Apr 2005 08:38

Re: Anwendung friert bei SQL ein
 
@Lemmy: Jasucol hat es genau auf den Punkt getroffen. Das ist es was ich meine.

@All:

Einen anscheinend geeigneten Thread habe ich dazu auch schon, jedoch funktioniert die Übergabe der Daten zur Anwendung noch nicht:
Delphi-Quellcode:
  unit SQLThread;
 
  interface
 
  uses
    Classes, ADODB, ComObj, ActiveX, SysUtils,
    Funktionen, Dialogs;
 
  type
    TSQLThread = class(TThread)
    private
      FQType : string;
      FQSQL : string;
      Fqry : TADOQuery;
      Fcmd : TADOCommand;
      FExceptionMessage: string;
      function GetConnectionString: String;
      procedure DoDataToVCL_VST;
    published
      property QType: string read FQType write FQType;
      property QSQL: string read FQSQL write FQSQL;
      property qry: TADOQuery read Fqry write Fqry;
      property cmd: TADOCommand read Fcmd write Fcmd;
    protected
      procedure Execute; override;
    public
  //    constructor Create(OnTerminate: TNotifyEvent);
      constructor Create;
      destructor Destroy; override;
      property ExceptionMessage: string read FExceptionMessage;
    end;
 
  implementation
 
  uses main;
  //------------------------------------------------------------------------------
  //constructor TSQLThread.Create(OnTerminate: TNotifyEvent);
  constructor TSQLThread.Create;
  begin
    inherited Create(True);
  //  Self.OnTerminate:=OnTerminate;
  //  FreeOnTerminate:=True;
    Resume;
  end;
  //------------------------------------------------------------------------------
  destructor TSQLThread.Destroy;
  begin
    Free;
  end;
  //------------------------------------------------------------------------------
  procedure TSQLThread.Execute;
  Var
    qry : TADOQuery;
    cmd : TADOCommand;
  begin
    { Place thread code here }
    try
      CoInitialize(nil);
      try
        if QType = 'qry' then
        begin
          qry:=TADOQuery.Create(nil);
          try
            qry.ConnectionString := GetConnectionString;
            qry.CommandTimeout := 3000;
            qry.SQL.Clear;
            qry.SQL.Text := QSQL;
            qry.Open;
            while not qry.Eof do
            begin
              //Verarbeitung mit der Anwendung - Daten zur Anwendung schicken
              //  Synchronize(DoDataToVCL_VST);
                qry.Next;
            end;
            qry.Close;
          finally
            qry.Free;
          end;
        end else
        begin
          cmd := TADOCommand.Create(nil);
          try
            cmd.ConnectionString := GetConnectionString;
            cmd.CommandTimeout := 3000;
            cmd.CommandText := QSQL;
            cmd.Execute;
          finally
            cmd.Free;
          end;
        end;
      finally
        CoUnInitialize;
      end;
    except
      on E: Exception do FExceptionMessage:=E.Message;
    end;
  end;
  //------------------------------------------------------------------------------
  function TSQLThread.GetConnectionString: string ;
  var ConnectionString: WideString;
  begin
    ConnectionString:='Provider=MSDAORA.1;'+
                      'Password=xxxxx;'+
                      'User ID=xxxxx;'+
                      'Data Source=xxxxx;'+
                      'Persist Security Info= true';
    Result:=ConnectionString;
  end;
  //------------------------------------------------------------------------------
  procedure TSQLThread.DoDataToVCL_VST;
  begin
    Form_Main.StatusBar.Panels[0].Text:='Test';
    Form_Main.StatusBar.Update;
  end;
end.
Vielleicht gibt es ja dazu ein paar Tipps?

MfG
schuetze09

Lemmy 13. Apr 2005 18:45

Re: Anwendung friert bei SQL ein
 
Hi,

gut, wenn die Anwender da freie SQL eingeben können wird es schwierig....

Zum Thread: Wo genau hast Du ein Problem?

schuetze09 14. Apr 2005 06:35

Re: Anwendung friert bei SQL ein
 
@Lemmy: Ich glaube ich habe es gelöst. Ich hatte beim Synchronize Probleme.

MfG
schuetze09


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz