![]() |
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:
Jedoch klappt dies nicht immer, und manchmal ist der letzte Logbucheintrag
[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
Code:
Dieser Eintrag wird geschrieben vor dem eigentlich Mailversand über die Indy Komponenten.
0721159 wird versendet an ***@bla.de
Im Erfolgsfalls soll anschliessend ein
Code:
kommen, ansonsten ein
Senden OK
Code:
Jedoch es kommt gar kein Eintrag, und die Serviceanwendung scheint zu hängen. Das Ulkige ist jedoch, DASS DIE MAIL ANKOMMT!!
Senden ERROR
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:
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.
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 ; |
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 |
Re: Serviceanwendung treibt mich in den Wahnsinn
Vielleicht den Service mal in eine normale Anwendung umschreiben, dann debuggen und wieder als Service definieren.
Florian |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
einfach unter Parameters /Debug eingeben, dann kann man auch einen Service debuggen ;) |
Re: Serviceanwendung treibt mich in den Wahnsinn
Moyen,
Zitat:
|
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
Zitat:
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? |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
gibt es den Punkt in D4 nicht oder was läuft dann nicht? |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
Ich muss diesen Service irgendwie debuggen können. Gibts denn da noch Möglichkeiten. |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
|
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
Was es in Delphi 4 nicht gibt, ist Start->Mit Prozess verbinden... |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
...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.. |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
Und genau diese kompilierte Anwendung trage ich doch unter Host-Application ein, oder. Oder welche Anwendung meinst Du? |
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 |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
Das ist die einzige EXE die ich habe. |
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. |
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 |
Re: Serviceanwendung treibt mich in den Wahnsinn
Es liegt vielleicht an der Delphi Version.
|
Re: Serviceanwendung treibt mich in den Wahnsinn
mag sein, sry daß ich dir nicht weiter helfen konnte
|
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" |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
@Union: Das ist ne Idee. In dem Fall sollte ich zumindest eine Fehlermeldung zu Gesicht bekommen. Dank an alle |
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:
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.
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 ; 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? |
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:
Des weiteren könntest Du versuchen, den Fehler weiter einzugrenzen:
sql.text := format ('select "%s" from Params where VarName = ''%s''',
[AType,AName]) ;
Delphi-Quellcode:
Ausserdem kannst Du AFAIK doch einen generellen Exception-Handler einsetzen:
try
open; except on e : exception do begin ShowMessage(e.Message); end; end;
Delphi-Quellcode:
uses Forms;
type ... procedure MyGlobalExptionHandler(Sender : TObject; E: Exception); ... Forms.Application.OnException := MyGlobalExceptionHandler; |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
SQL-Code:
select StringValue from Params where Varname = 'Path EMails Root'
Zitat:
Code:
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:
BDE error $000F
Blöde Datenbank Exceptions :mrgreen: EDIT: Sorry, hatte falschen Error Code gepostet. |
Re: Serviceanwendung treibt mich in den Wahnsinn
Hab jetzt mal
![]() Zitat:
Jetzt hab ich ein echtes Problem, denn ich bin mit meinem Delphi 4 gezwungen über die BDE auf den SQL Server zuzugreifen. |
Re: Serviceanwendung treibt mich in den Wahnsinn
Zitat:
|
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
![]() 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