Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Fehler, wenn Exe in Autostart (https://www.delphipraxis.net/130616-sql-fehler-wenn-exe-autostart.html)

Jens Hartmann 11. Mär 2009 10:32

Datenbank: Firebird • Version: 2.1 • Zugriff über: Zeos

SQL Fehler, wenn Exe in Autostart
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

schon wieder mal ein Problem, wo ich gerade mal nicht weiterkomme.

Ich habe mein Programm ja mit einer Firebird Datenbank ausgestattet. Die Firebird, habe ich auch als Dienst installiert. Starte ich meine Programm bei normalem PC Betrieb, funktioniert auch alles. Lege ich mein Programm in die Autostart von Windows, kommt folgender Fehler.
:gruebel:

Woran kann das liegen. Hat da jemand ein Idee.

Gruß

Jens

Bernhard Geyer 11. Mär 2009 10:32

Re: SQL Fehler, wenn Exe in Autostart
 
Zitat:

Zitat von Jens Hartmann
..., kommt folgender Fehler.
:gruebel:

Tja, welcher nun :gruebel:

mkinzler 11. Mär 2009 10:34

Re: SQL Fehler, wenn Exe in Autostart
 
Wo liegt die Datenbank?

Bernhard Geyer 11. Mär 2009 10:36

Re: SQL Fehler, wenn Exe in Autostart
 
Falls es Netzwerklaufwerk ist könnt da das Problem liegen da die Netzlaufwerke u.U. erst verspätet verbunden werden.

Jens Hartmann 11. Mär 2009 10:54

Re: SQL Fehler, wenn Exe in Autostart
 
Die Datenbank liegt im Programmordner unter C:\Programme\HU\MeineSoftware

nahpets 11. Mär 2009 10:55

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

wenn ein Programm aus dem Autostart aufgerufen wird, heißt das noch nicht zwingend, dass zu diesem Zeitpunkt schon alle Dienste laufen. Die Startreihenfolge scheint mir undefiniert zu sein.

Sprich: Wenn's kracht, im Programm eine Pause einlegen und später nochmal probieren. Oder prüfen, ob der Dienst schon läuft, sonst warten, bis er läuft.

Prüfen, ob ein Dienst läuft, könntest Du mit ServiceManager.pas .

Bis bei meinem Rechner morgends nach dem Einschalten alles läuft, vergehen schon mal fünf Minuten, so bekomme ich regelmäßig die Fehlermeldung, dass noch nicht alle Laufwerksverbindungen aufgebaut werden konnten, lange bevor die Laufwerksverbindungen überhaupt aufgebaut werden.

Jens Hartmann 11. Mär 2009 16:19

Re: SQL Fehler, wenn Exe in Autostart
 
Habe mir das jetzt angesehen, und die Unit bei mir eingebunden. Leider funktioniert das nicht, Da mein Programm die Funktion GetServiceStatus angeblich nicht kennt.

Ich habe mir ein paar Tips, von diesem Thread geholt. Vieleicht jemand noch ne Idee.

ServiceManager

nahpets 11. Mär 2009 16:57

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

schade, das der Link von mir nicht das gewünschte Ergebnis gebracht hat, aber das von Dir Verlinkte scheint doch in die richtige Richtung zu führen. Die Unit1 aus post269663 sollte zusammen mit uNTServiceControl.pas aber zur gesuchten Problemlösung beitragen können.

juergen 11. Mär 2009 18:10

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

du könntest dein Programm mit einem Windowsscript mit Verzögerung starten.
Einfach folgendes als *.vbs- Datei abspeichern und in den Autostart:
Zitat:

Option Explicit

Dim objShell
Dim intVerzoegerung

' Zuerst die Verzögerung deklarieren....

intVerzoegerung = 60000 ' in Millisekunden
WScript.Sleep intVerzoegerung

' Jetzt das entsprechende Programm zuordnen

Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.Exec ("C:\...Programm.exe")
Windowsscript hat den Vorteil, dass bei einem Fehler die Meldungen aussagefähiger sind.

mschaefer 11. Mär 2009 18:49

Re: SQL Fehler, wenn Exe in Autostart
 
Moin,

würde einfach vor dem öffnen der Datenbank eine Pause einbauen.
Falls es dann noch nicht geht nochmal pause (schleife).

Ideal das Programm im Autostart mit einem Parameter zu starten /t:5
wobei 5 dann für die Sekunden bis zum Datenbanköffnen steht.

Grüße in die Runde // Martin

Jens Hartmann 11. Mär 2009 19:34

Re: SQL Fehler, wenn Exe in Autostart
 
Danke schon mal für die vielen antworten. Ich habe jetzt folgende Routine geschrieben.

Delphi-Quellcode:
//Abfrage in der OnCreate von Form1
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
    VSTfüllen;
    PDatenbankdienst.Caption := 'Datenbank gestartet';
    PDatenbankdienst.Color := clLime;
  end
  else
  begin
    PDatenbankdienst.Caption := 'Datenbank wird gestartet';
    PDatenbankdienst.Color := clred;
    TAufDienstWarten.Enabled := true;
    TTimeOutDienst.Enabled := true;
  end;

//Timer 1 Datenbank Dienst wird im 1 Sec. Takt abgefragt
procedure TForm1.TAufDienstWartenTimer(Sender: TObject);
begin
  if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
    begin
      VSTfüllen;
      TAufDienstWarten.Enabled := false;
      TTimeOutDienst.Enabled := false;
    end;
end;

//Timer 2 Datenbank wird als nicht geöffnet angegeben. TimeOut Fehler
procedure TForm1.TTimeOutDienstTimer(Sender: TObject);
begin
  ShowMessage('Der Datenbankdienst konnte nicht gestartet werden'+#13#10+'Bitte starten Sie das Programm neu');
  TAufDienstWarten.Enabled := False;
  TTimeOutDienst.Enabled := False;
end;

//VSTFüllen wird nur bei gestartetem Dienst über Timer1 ausgeführt, jedoch hier nochmal die Abrage, falls die Funktion
//später irgendwann nochmal von einer anderen Stelle im Programm aufgerufen wird.
procedure TForm1.VSTFüllen;
var
  Daten : TOMB256PLUS;
  Count : Integer;
begin
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
  if not QryMB256PLUS.Active then
    QryMB256PLUS.Open;
Habe das ganze dann ausprobiert, in dem ich den Dienst gestoppt habe und wieder gestartet habe. Funktioniert dann auch.
Aber beim Windows Start immer noch nicht. Ich vermute das ein anderer Dienst abgefragt wird, kann das sein ?

nahpets 12. Mär 2009 09:01

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,
Zitat:

Zitat von Jens Hartmann
Habe das ganze dann ausprobiert, in dem ich den Dienst gestoppt habe und wieder gestartet habe. Funktioniert dann auch.
Aber beim Windows Start immer noch nicht. Ich vermute das ein anderer Dienst abgefragt wird, kann das sein ?

'ne, kann eigentlich nicht sein. Das manuelle Stoppen und Starten des Dienstes könnte schneller funktionieren, als beim Rechnerstart. Was passiert, wenn Du den Dienst manuell stoppst, das Programm startes, den Dienst manuell startest. Hier würde ich vermuten, dass das am ehesten an das Problem beim Autostart herankommt.

Wo liegt das Programm? Hat es beim Start aus dem Autostart das gleiche Arbeitsverzeichnis wie beim "normalen" start oder kommt es hier eventuell mit dem Arbeitspfad nicht zurecht, so dass ein anderer Fehler auftritt, als eigentlich vermutet. Sprich: Wenn der Dienst läuft und Du startest das Programm über das Startmenü/Programme/Autostart. Geht das fehlerfrei?

Wie hast Du das Timerinterval gesetzt? Ist das ausreichend lang? Hier würde ich als Wartezeit eher Minuten als einige Sekunden setzen. Bei meinem Rechner vergehen locker 2 bis 3 Minuten, bevor ich sicher auf alles zugreifen kann, auch wenn die Oberfläche lange vorher voll funktionsfähig ist.

Wenn Du in der DOS-Box net start eingibst, solltest Du dort den korrekten Namen des zu überprüfenden Dienstes finden (wenn der Dienst gestartet ist). Die dort erscheinende Zeichenfolge musst Du dann bei ServiceGetStatus abfragen.
Die Art, wie Du das realisiert hast, erscheint mir korrekt. Momentan sehe ich nur drei mögliche Fehler: Falscher Dienstname in der Abfrage, zu kurze Wartezeit bis zum Dienststart oder ein anderer Fehler, der nur beim Aufruf aus dem Autostartordner auftritt.

Wenn das alles irgendwie nicht weiterhilft, so starte das Programm aus der Autostart heraus mal bitte mit folgender Batchdatei:
Code:
@echo off
:start
@echo on
net start | find "DeinDienstName"
@echo off
set myError=%ERRORLEVEL%
echo Fehlercode von Find = %myError%
if "%myError%"=="1" echo Der Dienst wurde noch nicht gestartet
if "%myError%"=="1" Pause
if "%myError%"=="1" goto start
echo Start Deines Programmes
:DeinProgrammOhneDoppelpunktDavor.exe
set myError=
und schau mal, ob nach endlicher Zeit und endlichem Betätigen von AnyKey Dein Programm so korrekt gestartet werden kann.

Jens Hartmann 12. Mär 2009 16:46

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo nahpets,


Also, ich habe alle deine Vorschläge schön durchgearbeitet, leider ohne Erfolg. Diese ganze Sache muss irgendwo anders her kommen.

Zitat:

Was passiert, wenn Du den Dienst manuell stoppst, das Programm startes, den Dienst manuell startest. Hier würde ich vermuten, dass das am ehesten an das Problem beim Autostart herankommt.
Funktioniert sauber, ohne Fehlermeldung, sogar wenn ich den Dienst erst eine Minute später starte.

Zitat:

Wo liegt das Programm? Hat es beim Start aus dem Autostart das gleiche Arbeitsverzeichnis wie beim "normalen" start oder kommt es hier eventuell mit dem Arbeitspfad nicht zurecht, so dass ein anderer Fehler auftritt, als eigentlich vermutet. Sprich: Wenn der Dienst läuft und Du startest das Programm über das Startmenü/Programme/Autostart. Geht das fehlerfrei?
Das Programm liegt in folgendem Verzeichnis...

D:\Delphi\Projekte\PrintSave\V1.15\Alarmanlage.exe
in diesem Verzeichns liegt auch die Datenbank usw.
Habe es allerdings auch komplett mit Laufwerk C:\Programm\HU\PrintSave probiert. Der gleiche Fehler..

Ja, starte ich das Programm aus "Startmenü/Programme/Autostart" bei laufendem Dienst, geht das ohne Fehler.

Zitat:

Wie hast Du das Timerinterval gesetzt? Ist das ausreichend lang? Hier würde ich als Wartezeit eher Minuten als einige Sekunden setzen. Bei meinem Rechner vergehen locker 2 bis 3 Minuten, bevor ich sicher auf alles zugreifen kann, auch wenn die Oberfläche lange vorher voll funktionsfähig ist.
Also, der Timer zur Abfrage ob der Dienst läuft sitzt auf 1 Sekunde. Und der Timer für die Timeout Funktion auf 10min. Jedoch, wäre es auch egal, wenn der Timeout Timer auf 10 sec. stände, da ich ja eingebaut habe. das die Datenbank bei nicht vorhandenem Dienst gar nicht erst geöffnet wird.

Delphi-Quellcode:
//VSTFüllen wird nur bei gestartetem Dienst über Timer1 ausgeführt, jedoch hier nochmal die Abrage, falls die Funktion
//später irgendwann nochmal von einer anderen Stelle im Programm aufgerufen wird.
procedure TForm1.VSTFüllen;
var
  Daten : TOMB256PLUS;
  Count : Integer;
begin
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
  if not QryMB256PLUS.Active then
    QryMB256PLUS.Open;
Zitat:

enn Du in der DOS-Box net start
Die Dienste, kann ich ja auch unter Verwalten einsehen, Es gibt 2 Dienste der Firebird, allerdngs sind die abhängig von einander und werden über den selben Name gestartet (Abfrage ist somit für mich identisch)

Zitat:

und schau mal, ob nach endlicher Zeit und endlichem Betätigen von AnyKey Dein Programm so korrekt gestartet werden kann.
Mit der Batch Datei, habe ich den selben Fehler.

nahpets 12. Mär 2009 17:06

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

das verstehe ich jetzt irgendwie garnicht mehr.

Ändere bitte mal die Batchdatei:
Code:
echo Start Deines Programmes
d:
cd D:\Delphi\Projekte\PrintSave\V1.15\
Alarmanlage.exe
set myError=
Bleibt der Fehler dann bestehen?

Wenn ja, häng' bitte mal 'nen Screenshot... von der Fehlermeldung mit hier rein.
Kannst Du eventuell im Programm in eine Textdatei mitloggen, welche Schritte durchgeführt werden, so ala
Code:
starte formcreate
beende formcreate
für alle Methoden, die beim Programmstart aufgerufen werden, um dahinter zu kommen, wo genau der Fehler passiert. Oder bau' Dir an allen wichtigen Stellen ein ShowMessage ein, mit dem Du nachvollziehen kannst, bis wo Du im Programm kommst. Momentan kann ich da nur im Neben stochern. Wenn Du da ein paar Infos zusammenbekommen könntest, würde ich mir das morgen noch mal anschauen.

Jens Hartmann 12. Mär 2009 18:02

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo nahpets,

Zitat:

Bleibt der Fehler dann bestehen?
Ja, der Fehler ist der selbe. Der Screenshot der Fehlermeldung befindet sich schon im ersten Post.

Zitat:

Kannst Du eventuell im Programm in eine Textdatei mitloggen, welche Schritte durchgeführt werden, so ala
Zitat:

Code: markieren
Delphi-Quellcode:
 
starte formcreate
beende formcreate


Das habe ich noch nie gemacht, wie meinst Du das. Einfach so die Art SavetoFile oder wie.

Habe das jetzt mit ShowMessage gemacht, und zwischen ShowMessage('2'); und ShowMessage('2b'); bring er den Fehler, das heißt genau bei

QryMB256PLUS.Open;

Delphi-Quellcode:

procedure TForm1.VSTFüllen;
var
  Daten : TOMB256PLUS;
  Count : Integer;
begin
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
  if not QryMB256PLUS.Active then
  ShowMessage('2');
    QryMB256PLUS.Open;
    ShowMessage('2b');
und wie man sieht, kann es nicht der Firebird Dienst sein, weil

Delphi-Quellcode:
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
der ist ja 4 also gestartet. Aber woher kommt der Fehler, Klicke ich die ShowMessage Meldungen nur langsam durch, so ala

1 Sek. Klick, 1 Sek. Klick etc. Startet mein Programm normal.

Starte ich nicht mit Autostart, sondern Manuell so 5 Sek, nach dem man glaubt Windows ist fertig. kommt kein Fehler.
Starte ich nicht mit Autostart, sofort, nachdem ich die Maus Bedienen kann, erscheint der Fehler, somit kann es nicht die Autostart sein.

Genau das gleiche ist ja auch, wenn ich die ShowMessage so ala 1 MSek Klick, 1 MSek Klick etc bestätige, da kommt der Fehler wie gesagt ja bevor ShowMessage 2b erscheint.

Gruß

Jens

PS: Es gibt doch soviel Programm die die Autostart nutzen. :gruebel: :gruebel:

mschaefer 12. Mär 2009 18:59

Re: SQL Fehler, wenn Exe in Autostart
 
Füge mal ein 'Application.Processmessages;' in Deine Warteschleife ein. // Grüße // Martin

Jens Hartmann 12. Mär 2009 22:05

Re: SQL Fehler, wenn Exe in Autostart
 
Sorry, das hat leider auch nichts gebracht, hatte ich bereits probiert.

Trotzdem Danke

Gruß Jens

Tyrael Y. 12. Mär 2009 22:19

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

wie einige schon geschrieben habn hast du keine Garantie darauf, was zuerst gestartet wird, der Service oder die Datenbank.
Du hast aber beim Service die Möglichkeit einen Abhängigkeit von einem anderen Programm zu definieren. Das sollte dir dann helfen.

Jens Hartmann 13. Mär 2009 07:41

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,
Zitat:

wie einige schon geschrieben habn hast du keine Garantie darauf, was zuerst gestartet wird, der Service oder die Datenbank.
Du hast aber beim Service die Möglichkeit einen Abhängigkeit von einem anderen Programm zu definieren. Das sollte dir dann helfen.
Das sehe ich ein wenig anders, wenn ich doch in meinem Programm vor dem Datenbankstart, den Dienst abfrage, wie in #11 beschrieben, ist es doch egal, ich frage ja schließlich vor dem öffnen der Datenbank ob der Dienst gestartet ist.

Gruß Jens
:gruebel:

nahpets 13. Mär 2009 08:16

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

da scheint es ja irgendein "Zeitproblem" zu geben.

Versuche es doch mal bitte in der Art:
Delphi-Quellcode:
var
     iError  : Integer;
     sMessage : String;

...

if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
  if not QryMB256PLUS.Active then begin
    iError := 0;
    DeleteFile('c:\netstart.txt'); // eine temporäre Logdatei, kann bei Funktion des Programmes entfallen.
    Repeat
      Try
        QryMB256PLUS.Open;
      Except
        on e : Exception Do begin
          sMessage := e.Message;
          Inc(iError);
          WinExec('CMD.EXE /C "net start >> c:\netstart.txt"',SW_HIDE); // nur zur momentanen Fehlersuche, kann später entfallen.
          Application.ProcessMessages;
          Sleep(1000);
        end;
      end;
    until QryMB256PLUS.Active or (iError > 5); // <- bitte ausprobieren, ob 5 reicht oder eventuell höher sein muss.
    if iError > 5 then begin
      ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
      + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
      Application.Terminate; // <- oder sonstige Fehlerbehandlung.
    end;
   
...
Beim WinExec sollte eine Datei erstellt werden, die jeweils die aktuell laufenden Dienste enthält. Kannst Du in dieser Datei zwischen den einzelnen Aufrufen einen Unterschied feststellen? Dann könnte dort eventuell eine Abhängigkeit zwischen Diensten bestehen, die Du bei Deiner Dienstprüfung mit berücksichtigen musst.

Für eine Fehlerprotokollierung schau bitte mal hier: ErrorLog
Zitat:

Zitat von Jens Hartmann
Das sehe ich ein wenig anders, wenn ich doch in meinem Programm vor dem Datenbankstart, den Dienst abfrage, wie in #11 beschrieben, ist es doch egal, ich frage ja schließlich vor dem öffnen der Datenbank ob der Dienst gestartet ist

Jain, in Bezug auf den Dienst dürftest Du recht haben, es gibt aber wohl noch eine andere Abhängigkeit, die momentan keiner von uns kennt.

Zeig' uns doch mal bitte die Ergebnisse von net start einmal mit den laufenden Datenbankdiensten, einmal ohne die Datenbankdienste. Eventuell gibt es da ja noch einen Unterschied mehr, als nur den von Dir abgefragten Dienst.

Hilft eventuell das weiter? Re: Firebird "SQL Error Code -904" Bitte um Hilfe
oder Re: Firebird und Vista

Jens Hartmann 13. Mär 2009 12:28

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo zusammen,

Also, mit dem Code von Nahpets, läuft es. Allerdings ist mit das nicht genau klar warum. Wenn ich deinen Code richtig verstanden hab, bedeutet dieser Teil, das bei einer Exception (also Fehler) der die Error var bis auf 5 hochgezählt wird. Über den Befehl WinExec, wird das net start durchgeführt, und eine TXT Datei erstellt, mit den jeweiligen gestarteten Diensten.
Was ich nicht versteh, sind die Befehle e : Exception (was ist e????), sMessage := e.Message (was ist sMessage und e.Message)

Delphi-Quellcode:
        on e : Exception Do begin
          sMessage := e.Message;
          Inc(iError);
          WinExec('CMD.EXE /C "net start >> c:\netstart.txt"',SW_HIDE); // nur zur momentanen Fehlersuche, kann später entfallen.
          Application.ProcessMessages;
          Sleep(1000);
        end;
Bei dem folgenden Code denke ich, zu wissen, das folgendes passiert. Ist die QryActiv oder der Fehler Größer 5 werden. falls
vorhanden Fehlermeldungen ausgegeben. Aber nur in dem Fall von Error <5.

Bei Activer Qry wid das Programm fortgesetzt.

Delphi-Quellcode:
    until QryMB256PLUS.Active or (iError > 5); // <- bitte ausprobieren, ob 5 reicht oder eventuell höher sein muss.
    if iError > 5 then begin
      ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
      + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
      Application.Terminate; // <- oder sonstige Fehlerbehandlung.
    end;
Damit, müsste das Problem zwar gelößt sein, aber wo der Fehler genau gelegen hat, würde ich totzdem gerne wissen. Wisst Ihr das jetzt, oder müsste ich dafür noch was prüfen.


Danke aber schon mal Gruß Jens

nahpets 13. Mär 2009 13:12

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo Jens,

ne, was der Fehler ist, wissen wir jetzt immer noch nicht, aber wir wissen, dass 5 Sekunden warten das Problem löst. Beim Programmstart steht irgendwas noch nicht zur Verfügung.

Für genauere Erläuterungen zur Fehlerbehandlung schau bitte mal in der Hilfe unter try. Hier nur eine kurze Erklärung:

sMessage ist ein von mir deklarierter String zum Speichern des Fehlertextes.
e ist der Name, unter dem die Exception angesprochen wird, das könnte auch Hugo oder Paul... heißen.
Mit e.Message erhalten wir den Fehlertext der Exception.

Delphi-Quellcode:
on e : Exception Do begin
  sMessage := e.Message;
  Inc(iError);
  WinExec('CMD.EXE /C "net start >> c:\netstart.txt"',SW_HIDE); // nur zur momentanen Fehlersuche, kann später entfallen.
  Application.ProcessMessages;
  Sleep(1000);
end;
Was mich interessieren würde, wäre der Inhalt der per WinExec erstellten Datei c:\netstart.txt. Könntest Du den bitte mal mit hier dranhängen, eventuell kann man da erkennen, ob innerhalb der 5 Sekunden noch ein weiterer Dienst gestartet wurde, mit dem wir hier garnicht rechnen. Alternativ: In der Datei müsste für jeden aufgetretenen Fehler (also bis zu 5 Mal) eine Liste der laufenden Dienste sein. Sind die einzelnen Abschnitte identisch oder ist da im Laufe der Zeit noch irgendein Dienst hinzugekommen?

Kann es sein, dass von dem Zeitpunkt, zu dem der Dienst gestartet wurde, bis zu dem Zeitpunkt, an dem er erstmalig Anforderungen annehmen kann, ein paar Sekunden vergehen? Er muss ja auch noch auf die Datenbankdatei zugreifen, die Datenbank öffenen, eventuell Logdateien erstellen, eine Konsistenzprüfung auf die Datenbankdatei machen, oder... Dies könnte dann dazu führen, dass der erste Zugriff erst nach Dienststart + x Sekunden möglich ist, wobei wir hier mit 5 Sekunden halt lange genug gewartet haben, was sich aber bei längerer Nutzung und Vergrößerung das Datenbank ändern könnte.

Benutzt Dein Programm irgendeine Laufwerksverbindung oder sonstige Resourcen ausserhalb des Rechners, auf dem das Programm läuft?

Dashier könnte man auch etwas verständlicher lösen, statt:
Delphi-Quellcode:
if iError > 5 then begin
  ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
  + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
  Application.Terminate; // <- oder sonstige Fehlerbehandlung.
 end;
wäre wohl besser:
Delphi-Quellcode:
if not QryMB256PLUS.Active then begin
  ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
  + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
  Application.Terminate; // <- oder sonstige Fehlerbehandlung.
 end;

Jens Hartmann 13. Mär 2009 15:23

Re: SQL Fehler, wenn Exe in Autostart
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, das habe ich soweit verstanden. Ich musste allerdings, die Delete Funktion der Datei entfernen, sonst war nach Programmstart keine Datei mehr enthalten...

Delphi-Quellcode:
  if not QryMB256PLUS.Active then begin
    iError := 0;
    //DeleteFile('c:\netstart.txt'); // eine temporäre Logdatei, kann bei Funktion des Programmes entfallen.
    Repeat
Im Anhang, habe ich die Datei, in der allrdings nur 1 mal Net Start enthalten ist. Ich habe mit der
Delphi-Quellcode:
  WinExec('CMD.EXE /C "net start >> c:\netstart.txt"',SW_HIDE);
Bislang noch nicht gearbeitet, daher weiß ich nicht, ob die Dateien angehängt odern überschrieben werden. Da ich es mehrmals durchgeführt habe, vermute ich das diese überschrieben wird.

Gruß Jens

Jens Hartmann 13. Mär 2009 15:29

Re: SQL Fehler, wenn Exe in Autostart
 
Ich habe übrigens mal ein

Delphi-Quellcode:
ShowMessage(IntToStr(iError));
vor das schreiben der Datei gepackt, und das wir auch nur einmal ausgeführt.

nahpets 13. Mär 2009 15:43

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo Jens,

beim Programmstart wird die Datei (soweit vorhanden) gelöscht.
Pro Programmstart wird sie einmal erstellt, sie sollte nach dem Programmende eigentlich erhalten bleiben. Wenn in der Datei nur einmal die Liste der Dienste ist, bedeutet dies, dass das Öffnen der Query beim zweiten Versuch bereits erfolgreich ist.
Dein Test mit ShowMessage führt ja auch zu dieser Erkenntnis.

Momentan gehe ich davon aus, dass die Datenbank zum Starten ein bisserl Zeit benötigt. Die Dienste laufen also schon und müssen noch irgendwas machen. Es erscheint mir momentan am sinnvollsten, wenn Du am Anfang des Programmes ein Sleep(5000) für 5 Sekunden Pause einbaust und dann die Routine so läßt, wie sie jetzt ist. Eventuell könntest Du das Sleep innerhalb der Repeat-Schleife auch noch auf 5000 setzen. Damit würde das Programm insgesammt ca. 30 Sekunden warten, bevor es mit einer Fehlermeldung abbricht. Das halte ich für akzeptabel.

Das DeleteFile und das WinExec kannst Du entfernen, die brauchen wir nicht mehr. Reibungsloser, als mit der derzeitigen Variante, wirst Du den Programmstart aus dem Autostart vermutlich nicht hinbekommen. Das Programm muss beim Rechnerstart einfach warten, bis Betriebssystem und Dienste richtig laufen.

Code:
net start >> c:\netstart.txt
Die beiden >> bedeuten, dass net start seine Ausgabe an die bereits bestehende c:\netstart.txt anhängt. Sofern die Datei nicht vorhanden ist, wird sie erstellt. Steht hier nur ein >, so wird eine bestehende Datei überschrieben. Es handelt sich hierbei um eine Funktionalität von DOS, die Du auch am DOS-Prompt nachvollziehen könntest.
WinExec ist nur zum Start eines anderen Programmes da und hat keinen Einfluß auf das Erstellen der Datei.

Jens Hartmann 13. Mär 2009 15:56

Re: SQL Fehler, wenn Exe in Autostart
 
Danke dir und natürlich allen anderen, für die nette und gute Hilfe.

Ich werde meine Routine dann jetzt noch anpassen. Und gegebenenfall´s wenn es bei einer großen Datenbank zu erneutem Fehler kommen sollte, die Zeit in der Repeatschleife anpassen.

Aber, mal noch ne andere Frage, es wurde in dem Thread, auf den Du hingewiesen hast, das mit LOCALHOST erwähnt.

LOCALHOST

Die Verbindung habe ich über das LOCALHOST aufgebaut.

und zwar momentan direkt in der TZConnection von Zeos...

LOCALHOST:D:\Delphi\Projekte\PrintSave\V1.15\Secur dat.fdb

Ich wollte die Zuweisung später über die Einstllungsoberfläche von meinem Progamm machen, aber halt beim Laden von meinem Programm diesen Wert aus einer INI Datei oder so direkt laden lassen.

Nicht das der Fehler von der Zuweisung der Datenbank kommt. Und ich dann wohlmöglich wieder das selbe Problem habe.

Später muss ich die Datenbank ja wahrscheinlich auch an einen ganz anderen Ort als das Programmverzeichnis legen
(Schreibrechte und so)

nahpets 13. Mär 2009 16:09

Re: SQL Fehler, wenn Exe in Autostart
 
Hallo,

von dem Thema habe ich jetzt höchstwahrscheinlich keine Ahnung. Vermutlich muss die Pfadangabe in der Form
Code:
Servername:pfadangabe
erfolgen (da befrag bitte mal die Datenbankdoku). Hier könnte ich mir vorstellen, dass der Zugriff beim Rechnerstart dann etwas länger dauert, da ja auch noch Verbindungen zu anderen Rechnern hergestellt werden müssen.

Wenn Du diese Angabe in eine INI-Datei auslagern willst, dann spendiere der INI-Datei doch auch noch eine Angabe zu dem Wert für Sleep, so dass Du das auch konfigurieren kannst, falls die 5 Sekunden nicht reichen oder deutlich zuviel sein sollten. Und wenn Du dann auch noch den Wert für iError konfigurierbar machst, kannst Du die Anzahl der Versuche zum Öffnen der Tabelle auch noch von ausserhalb des Programmes steuern. Dann bist Du in Bezug auf den Workaround auf der sicheren Seite.

Jens Hartmann 13. Mär 2009 16:13

Re: SQL Fehler, wenn Exe in Autostart
 
Danke,

das werde ich so machen. Also besten Dank. Würde mich gerne Revangieren, denke aber das das noch ein bißchen dauert, bis ich soweit bin.

Gruß Jens und nochmal danke.

mkinzler 13. Mär 2009 16:15

Re: SQL Fehler, wenn Exe in Autostart
 
Zitat:

Zitat von Jens Hartmann
Danke,

das werde ich so machen. Also besten Dank. Würde mich gerne Revangieren, denke aber das das noch ein bißchen dauert, bis ich soweit bin.

Gruß Jens und nochmal danke.

Da siend wir hier kommunistisch, jeder gibt was er im Stande ist :zwinker:

Jens Hartmann 13. Mär 2009 16:49

Re: SQL Fehler, wenn Exe in Autostart
 
Na, das denke ich mache ich schon. Ich meinte ja auch bis ich nahpets mal helfen kann.

In der Beziehung bin ich Eurer Meinung

Gruß

Jens


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