Delphi-PRAXiS
Seite 3 von 3     123   

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 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 08:32 Uhr.
Seite 3 von 3     123   

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