Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Serviceanwendung treibt mich in den Wahnsinn (https://www.delphipraxis.net/58318-serviceanwendung-treibt-mich-den-wahnsinn.html)

Jelly 5. Dez 2005 14:32


Serviceanwendung treibt mich in den Wahnsinn
 
Ich habe eine Serviceanwendung, die im Grunde nichts anderes machen soll, als im stündlichen Rythmus in einer SQL Tabelle nachzuschlagen, ob irgendwelche Mails (automatisch vom Programm erzeugt) verschickt werden müssen. Sinn des Ganzen soll sein, dass Benutzer heute schon Mails versenden, und nicht mehr daran denken müssen. Reell soll die Mail aber an einem vordefiniertem Datum rausgehen.

Im Grund klappt das auch. Weil ich die Serviceanwendung jedoch unter Delphi4 nicht debuggt bekomme, weiss ich nicht so recht wie ich rangehen soll, um Programmierfehler zu finden. Ich erzeuge zur Zeit einfach ein Logbuch, in dem dann alle relevanten Schritte oder Fehler eingetragen werden... Sieht im Erfolgsfall etwa so aus:
Code:
[05.12.05 15:09:45] - Temporäres Verzeichnis gesetzt auf "C:\WINDOWS\TEMP\Brunata\"
[05.12.05 15:09:45] - Service gestartet
[05.12.05 15:09:45] - Mit SQL Server verbunden
[05.12.05 15:09:45] - Erster Durchlauf in 2 Sekunden
[05.12.05 15:09:47] - Starte periodischer Vorgang
[05.12.05 15:09:47] - 
[05.12.05 15:09:47] - Mailmodul = dmDelProp
[05.12.05 15:09:47] -     1 Liegenschaften sind betroffen
[05.12.05 15:09:47] -     0721159 wird versendet an ***@bla.de
[05.12.05 15:09:48] -         Senden OK
[05.12.05 15:09:48] -         Sendedatum setzen OK
[05.12.05 15:09:48] -     Alle Liegenschaften wurden behandelt
[05.12.05 15:09:48] - 
[05.12.05 15:09:48] - Periodischer Vorgang beendet. Nächster Vorgang um 05.12.2005 15:10:17
[05.12.05 15:09:59] - Service gestoppt
Jedoch klappt dies nicht immer, und manchmal ist der letzte Logbucheintrag
Code:
0721159 wird versendet an ***@bla.de
Dieser Eintrag wird geschrieben vor dem eigentlich Mailversand über die Indy Komponenten.
Im Erfolgsfalls soll anschliessend ein
Code:
Senden OK
kommen, ansonsten ein
Code:
Senden ERROR
Jedoch es kommt gar kein Eintrag, und die Serviceanwendung scheint zu hängen. Das Ulkige ist jedoch, DASS DIE MAIL ANKOMMT!!

Noch skuriler... In einigen Fällen wird das Logbuch korrekt erstellt. Ich seh keinen Zusammenhang.

Leider ist es jetzt schwer hier Code zu posten, und den genau zu erklären, da relativ viel dahinter steckt. Aber vielleicht sind ja solche Probleme allgemein bekannt bei Serviceanwendungen. Am eigentlichen Mailmodul kanns eigentlich nicht hängen da dasselbe in normalen Applikationen bislang tadellos funktionniert.

Naja, hier mal trotzdem der Code

Delphi-Quellcode:
with qryBetroffeneLiegenschaften do begin
    try
      open ;
    except
      Log.Add (1,'*** E R R O R *** View vwInformHurthOnDeletedProperties konnte nicht geöffnet werden') ;
      exit ;
    end ;

    if Active then begin  // Active prüft lediglich, ob die Datenbankverbindung noch steht
       Log.Add (1,Format ('%d Liegenschaften sind betroffen',[AnzahlLiegenschaften])) ;
       while not EOF do begin
          LiegenschaftAusserBetrieb.Prepare (FieldByName('ID').AsInteger) ;
          LiegenschaftAusserBetrieb.RelatedFields.Prop := FieldByName('ID').AsInteger ;
          ToAddress := LiegenschaftAusserBetrieb.CommonValue('SB_Hurth_EMail') ;
          Log.Add (1,format(
             '%s wird versendet an %s',
             [FieldByName('Nr').AsString,
              ToAddress]
          )) ;
          if LiegenschaftAusserBetrieb.Execute (ToAddress,-1) then begin  // Die eigentliche Senderoutine
             Log.Add (2,'Senden OK') ;
             qrySetSentDatum.ParamByName('ID').AsInteger := FieldByName('ID').AsInteger ;
             qrySetSentDatum.ParamByName('Datum').AsDatetime := now ;
             try
                qrySetSentDatum.ExecSQL ;
                Log.Add (2,'Sendedatum setzen OK') ;
             except
                Log.Add (2,'Sendedatum setzen *** E R R O R ***') ;
             end ;
          end else begin
             Log.Add (2,'Senden *** E R R O R ***') ;
          end ;
          next ;
       end ;
       Log.Add (1,'Alle Liegenschaften wurden behandelt') ;
    end ;

    close ;
 end ;
Also meine eigentliche Frage wäre wohl, wie ich eine Serviceanwendung debuggen kann unter Delphi 4. Oder genauso helfen würde mir, wenn mir einer diese abstruse Verhalten erklären könnte.

Tyrael Y. 5. Dez 2005 14:53

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Moin Jelly,

...in der Delphi IDE im Menü...Run -> Parameters
...unter Host-Application den Pfad zur Service-EXE
...und unter Parameters /Debug eingeben


..sollte so gehen


Gruß
Tyrael

Zacherl 5. Dez 2005 14:53

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Vielleicht den Service mal in eine normale Anwendung umschreiben, dann debuggen und wieder als Service definieren.

Florian

Tyrael Y. 5. Dez 2005 15:05

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Florian Bernd
Vielleicht den Service mal in eine normale Anwendung umschreiben, dann debuggen und wieder als Service definieren.

Florian

Das ist nicht notwendig...
einfach unter Parameters /Debug eingeben, dann kann man auch einen Service debuggen ;)

Union 5. Dez 2005 15:09

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Moyen,

Zitat:

Zitat von Jelly
Delphi-Quellcode:
if LiegenschaftAusserBetrieb.Execute (ToAddress,-1) then begin  // Die eigentliche Senderoutine
Jedoch es kommt gar kein Eintrag, und die Serviceanwendung scheint zu hängen. Das Ulkige ist jedoch, DASS DIE MAIL ANKOMMT!!

Das deutet doch darauf hin, dass der Fehler sich in der Methode Execute befindet - und zwar nach dem Senden der Mail. Wie baust Du die Mail selber auf? Vielleicht gibst Du irgendetwas nicht mehr frei (stringpointer o.ä.), oder einer der berühmten Indy-Timeout-Exceptions werden ausgelöst.

Jelly 5. Dez 2005 15:09

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Tyrael Y.
...in der Delphi IDE im Menü...Run -> Parameters
...unter Host-Application den Pfad zur Service-EXE
...und unter Parameters /Debug eingeben

Nee, leider nicht.

Zitat:

Vielleicht den Service mal in eine normale Anwendung umschreiben, dann debuggen und wieder als Service definieren.
Das wäre aber für den weiteren Verlauf ziemlich unpraktisch. Ich kann doch nicht jedesmal meine ganze Anwendung umkrempeln, nur um einen Fehler zu suchen.

Ich habe mittlerweilen den Verdacht, dass es an der BDE liegt. Ich muss da mal noch bischen testen, dann kann ich hoffentlich mehr dazu sagen. Wie es scheint, taucht der Fehler nur dann auf, wenn ich während der Service läuft, ich in einer anderen Anwendung eine bestimmte DB Tabelle geöffnet habe. Wenn dem so sei, wär es für mich nicht allzu tragisch, weil der Service nachher eh auf dem Firmenserver laufen wird.

Deshalb mal noch ne Frage hier: Kann es sein dass die BDE Probleme macht, wenn 2 User (also der angemeldete und das Systemkonto) auf eine Datenbank zugreifen?

Tyrael Y. 5. Dez 2005 15:13

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Tyrael Y.
...in der Delphi IDE im Menü...Run -> Parameters
...unter Host-Application den Pfad zur Service-EXE
...und unter Parameters /Debug eingeben

Nee, leider nicht.

Ich arbeite selbst mit Servicen und debugge diese auf diese Art...
gibt es den Punkt in D4 nicht oder was läuft dann nicht?

Jelly 5. Dez 2005 15:15

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Union
Das deutet doch darauf hin, dass der Fehler sich in der Methode Execute befindet - und zwar nach dem Senden der Mail.

Ja, das sehe ich auch so. Aber wieso klappt mal, und mal nicht. Noch eine weitere Bemerkung: Befinden sich mehr als nur eine Mail in der Queue, so werden diese bislang immer anstandlos alle korrekt versandt.

Ich muss diesen Service irgendwie debuggen können. Gibts denn da noch Möglichkeiten.

Union 5. Dez 2005 15:18

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Jelly
Ich muss diesen Service irgendwie debuggen können. Gibts denn da noch Möglichkeiten.

Hast Du denn schon die anderen Vorschläge hier ausprobiert oder funktioniert das mit Delphi4 nicht?

Jelly 5. Dez 2005 15:18

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Tyrael Y.
Ich arbeite selbst mit Servicen und debugge diese auf diese Art...
gibt es den Punkt in D4 nicht oder was läuft dann nicht?

Doch, aber nach dem Start in der IDE beendet sich der Service gleich wieder.
Was es in Delphi 4 nicht gibt, ist Start->Mit Prozess verbinden...

Tyrael Y. 5. Dez 2005 15:26

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Tyrael Y.
Ich arbeite selbst mit Servicen und debugge diese auf diese Art...
gibt es den Punkt in D4 nicht oder was läuft dann nicht?

Doch, aber nach dem Start in der IDE beendet sich der Service gleich wieder.
Was es in Delphi 4 nicht gibt, ist Start->Mit Prozess verbinden...

..das wundert mich, weil wennn du zB. eine DLL debuggen möchtest, die zu diesem Service gehört, dann musst du ja auch ne Möglichkeit haben, um Delphi zu sagen zu welcher Service-Application es gehört...woher sollte das Delphi sonst wissen...der Parameter /Debug bewirkt, daß du ein DebugWindow angezeigt bekommst, wo du die selben Punkte wie im Service-Manager hast...sprich Stoppen, Starten Pause, usw...

...irgendwo musst du aber schon en Möglichkeit haben, um sagen zu können welcher Service denn die zugrundeliegende Applikation ist...sry ich kenne D4 nicht..

Jelly 5. Dez 2005 15:32

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Tyrael Y.
...irgendwo musst du aber schon en Möglichkeit haben, um sagen zu können welcher Service denn die zugrundeliegende Applikation ist...sry ich kenne D4 nicht..

Vielleicht reden wir aneinander vorbei. Ich habe eine Serviceanwendung, also ein Projekt unter Delphi, namens SendMailTasks.dpr

Und genau diese kompilierte Anwendung trage ich doch unter Host-Application ein, oder. Oder welche Anwendung meinst Du?

Tyrael Y. 5. Dez 2005 15:34

Re: Serviceanwendung treibt mich in den Wahnsinn
 
....ne nicht die *.DPR

..du hast doch den Service selbst irgendwo in kompilierter Form auf der Platte liegen..
...zB. C:\MeinService\MeinService.exe... diesen Pfad musst du dort eingeben...und halt unter Parameter noch /Debug

Jelly 5. Dez 2005 15:43

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Tyrael Y.
....ne nicht die *.DPR

..du hast doch den Service selbst irgendwo in kompilierter Form auf der Platte liegen..
...zB. C:\MeinService\MeinService.exe... diesen Pfad musst du dort eingeben...und halt unter Parameter noch /Debug

Ja, genau den SendMailTasks.exe hab ich dort eingetragen.
Das ist die einzige EXE die ich habe.

Jelly 5. Dez 2005 15:54

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Kann zwar den Service immer noch nicht debuggen, aber ich meine aber das Problem erkannt zu haben, warum das Logbuch manchmal korrekt erstellt wird und manchmal nicht. Ich habe tatsächlich den Verdacht, dass es an der BDE liegt. Sobald ich meine Anwendung (als Benutzer) schliesse, oder auch nur auf einen anderen Datensatz scrolle, läuft mein Service einwandfrei. Irgendwie scheint es einen Recordlock über die BDE zu geben, die dem Service nicht erlaubt, einen Datensatz zu ändern. Und das obwohl ich in der Desktopanwendung ein Select direkt über eine Tabelle mache, und im Service ein Select über eine View und zum Editieren des Records einen direkten Update zum SQL Server sende. Aber da scheint mir die BDE wohl keinen grossen Unterschied zu machen.

Ich denke also einfach, dass die BDE nicht damit klar kommt, dass 2 Konten auf die Bibliotheken zugreifen.

Kann das einer bestätigen.

Tyrael Y. 5. Dez 2005 15:54

Re: Serviceanwendung treibt mich in den Wahnsinn
 
hm komisch, ich arbeite bei einer Client-Server-Anwendung mit Servicen und ich debugge die ganze Zeit auf diese Weise,...sry aber so wie ich es beschrieben habe sollte es gehen....
ausser natürlich dein Service läuft grad schon ;)...dann natürlich den Service erst über den Service-Manager stoppen

Jelly 5. Dez 2005 15:57

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Es liegt vielleicht an der Delphi Version.

Tyrael Y. 5. Dez 2005 15:59

Re: Serviceanwendung treibt mich in den Wahnsinn
 
mag sein, sry daß ich dir nicht weiter helfen konnte

Union 5. Dez 2005 16:02

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Mir ist noch etwas dazu eingefallen: Du hast den Service aus Sicherheitsgründen bestimmt so konfiguriert, dass er keinen Desktop-Zugriff hat (nicht interaktiv). Sollte die VCL jetzt einen Fehler ausgeben, so wird die Messagebox dennoch aufgebaut, allerdings in einem für den User unsichtbaren Bereich. Daraufhin scheint die Anwendung zu hängen. Vielleicht kannst Du den Dienst zur Fehlersuche zweitweilig als "interaktiv" konfigurieren:

Services.msc->Dienst Eigenschaften->Register "Anmelden"->"Datenaustausch zwischen Dienst uznd Desktop zulassen"

Jelly 5. Dez 2005 16:39

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Tyrael Y.
mag sein, sry daß ich dir nicht weiter helfen konnte

Trotzdem vielen Dank. Beim nächsten Dienst werd ich mein Delphi 6 nehmen. Nur in diesem Fall bin ich aus anderen auf D4 angewiesen.

@Union: Das ist ne Idee. In dem Fall sollte ich zumindest eine Fehlermeldung zu Gesicht bekommen.

Dank an alle

Jelly 6. Dez 2005 09:38

Re: Serviceanwendung treibt mich in den Wahnsinn
 
So, ich hab nun mal den Dienst interaktiv laufen, und hab die Prozedur gefunden, in der es manchmal zu Problemen führt:
Delphi-Quellcode:
function TFileArchiever.GetValueParams (AName, AType : string) : string ;
var
 qry : TQuery ;
 C : integer ;
begin
      try
          qry := TQuery.Create (Self) ;
          qry.DatabaseName := DatabaseName ;

          AType := uppercase(AType) ;
          if AType = 'S' then AType := 'StringValue' ;
          if AType = 'I' then AType := 'IntValue' ;
          if AType = 'F' then AType := 'FloatValue' ;
          if AType = 'D' then AType := 'DateTimeValue' ;
          with qry do begin
              close ;
              sql.text := format ('select %s from Params where VarName = ''%s''',
                        [AType,AName]) ;

              { Diese Message wird noch gezeigt }
              showmessage (sql.text) ;

              { Hier kommt es wohl zu einem Fehler }
              open ;

              Showmessage (FieldByName (AType).AsString) ;
              { >>> Dieses Feld ist leer, warum? Die Query stimmt }
              {     Die Showmessage erscheint nicht mehr }

              Showmessage ('Params table opened') ;
              if not (EOF and BOF) then begin
                 Result := FieldByName (AType).AsString ;
                 if (copy(Result,length(Result),1) <> '\') and (Result <> '')
                 then Result := Result + '\' ;
              end else begin
                 Result := '' ;
              end ;
              close ;
              Showmessage ('The Value: ' + Result) ;
              if not (DirectoryExists (Result))
              then ForceDirectories (Result) ;
          end ;
      finally
          qry.free ;
      end ;
end ;
Es ist wohl in Zeile 24 beim Öffnen der Tabelle, wo es zu einem Fehler kommt. Ich würd mir ja mal gern die Fehlermeldung anzeigen lassen, nur wie? Ein Umbiegen von application.OnException gibts nicht bei Serviceanwendungen.

Die Query ist so vollkommen in Ordnung, die Rechte sind im SQL Server auch für das SYSTEM Konto korrekt vergeben.

In der Query rufe ich lediglich einen Wert aus der Tabelle "Params" ab, die aber rein gar nichst mit einem Recordlock zu tun haben kann, da ich 1. überhaupt von nirgends sonstwo auf diese Tabelle zugreife, und 2. wenn doch, dann wirklich höchstens lesend, da es nur eine Nachschlagtabelle ist.

Ist das jetzt Zufall, dass der Dienst gerade in dieser Zeile seine Arbeit verweigert, und der Fehler sonstwo im Detail liegt, der spinn ich nun vollends und hab da wirklich im geposteten Code was falsch gemacht?

Union 6. Dez 2005 09:51

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Hallo Jelly,

welchen Wert hat denn AName? Vielleicht hast Du dort ein Feld, das mit einem reservierten Namen benannt ist (z.B. "USER")? Dann solltest Du das Format so anwenden (mit doppelten Hochkomma):
Delphi-Quellcode:
sql.text := format ('select "%s" from Params where VarName = ''%s''',
                        [AType,AName]) ;
Des weiteren könntest Du versuchen, den Fehler weiter einzugrenzen:
Delphi-Quellcode:
try
  open;
except
  on e : exception do
  begin
    ShowMessage(e.Message);
  end;
end;
Ausserdem kannst Du AFAIK doch einen generellen Exception-Handler einsetzen:
Delphi-Quellcode:
uses Forms;
type
...
procedure MyGlobalExptionHandler(Sender : TObject; E: Exception);
...
Forms.Application.OnException := MyGlobalExceptionHandler;

Jelly 6. Dez 2005 10:07

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Union
welchen Wert hat denn AName?

Der SQL Befehl ist schon in Ordnung...
SQL-Code:
select StringValue from Params where Varname = 'Path EMails Root'
Zitat:

Zitat von Union
Delphi-Quellcode:
try
  open;
except
  on e : exception do
  begin
    ShowMessage(e.Message);
  end;
end;

Damit kommen wir dem Problem vielleicht schon näher und bestätigt meinen Verdacht... Als Message krieg ich
Code:
BDE error $000F
Keinen Schimmer, was das jetzt heisst. Werd mal bischen googeln. Auf jeden Fall scheint mir wirklich die BDE diese Kopfzerbrechen zu bereiten. Jetzt weiss ich auch was BDE heisst:
Blöde Datenbank Exceptions
:mrgreen:

EDIT: Sorry, hatte falschen Error Code gepostet.

Jelly 6. Dez 2005 10:29

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Hab jetzt mal hier was über den BDE Fehler gefunden:
Zitat:

Zitat von Borland
BDE Error 000F usually indicates that the buffer manager ran out of memory, though there may be other causes for this error. Increasing the BDE SHAREDMEMSIZE parameter in BDE Admin may solve the problem, or just delay the error from occuring.

Aber das ist ja wirklich ne nützliche Hilfestellung von Borland :wall:

Jetzt hab ich ein echtes Problem, denn ich bin mit meinem Delphi 4 gezwungen über die BDE auf den SQL Server zuzugreifen.

Union 6. Dez 2005 10:35

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Zitat:

Zitat von Jelly
Jetzt hab ich ein echtes Problem, denn ich bin mit meinem Delphi 4 gezwungen über die BDE auf den SQL Server zuzugreifen.

Gibt es wirklich keine andere Möglichkeit? Und wird das in der Produktion auch passieren? Du sagtest doch es tritt nur auf wenn Du gleichzeitig ausserhalb des Service auf der selben Maschine über BDE zugreifst. Ist das eine Vorgabe des Kunden dass eine so uralte Version eingesetzt werden muss?

Jelly 6. Dez 2005 10:42

Re: Serviceanwendung treibt mich in den Wahnsinn
 
Ich hab den Service mal testweise auf dem Server angeschmissen, und da lief er auch nicht. Ich bin deshalb auf die BDE beschränkt, weil die Umstellung auf ADO oder noch besser direkt auf native MSSQL Komponenten (bsp. SDAC von Crlab) einfach zu aufwendig ist.

Ich hab mir jetzt mal die Params Tabelle genauer unter die Lupe genommen, und da hat ist die Spalte Stringvalue als varchar(300) definiert. Damit scheint die BDE Probleme zu haben. Ich hab die Länge jetzt auf 255 heruntergesetzt, und siehe da, es klappt. Zumindest was die ersten Tests angehen. Ist die Länge grösser als 255, so wird von der BDE ein Blob übertragen, das z.B. in einem Memofeld eingetragen werden kann.

Es ist aber trotzdem noch seltsam, dass ich genau die gleiche Routine im Programm an diversen anderen Stellen anwende, und noch nie Probleme hatte. Also die BDE hat nicht zu unrecht den Ruf, dass sie doch ganz schön in die Jahre gekommen ist.

Nun ja, ich befürchte früher oder später wird wohl doch auf ein anderes System umgesattelt werden müssen.

Danke für alle Bemühungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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