![]() |
Re: SQL Fehler, wenn Exe in Autostart
Danke schon mal für die vielen antworten. Ich habe jetzt folgende Routine geschrieben.
Delphi-Quellcode:
Habe das ganze dann ausprobiert, in dem ich den Dienst gestoppt habe und wieder gestartet habe. Funktioniert dann auch.
//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; Aber beim Windows Start immer noch nicht. Ich vermute das ein anderer Dienst abgefragt wird, kann das sein ? |
Re: SQL Fehler, wenn Exe in Autostart
Hallo,
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? 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:
und schau mal, ob nach endlicher Zeit und endlichem Betätigen von AnyKey Dein Programm so korrekt gestartet werden kann.
@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= |
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:
Zitat:
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:
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:
Zitat:
|
Re: SQL Fehler, wenn Exe in Autostart
Hallo,
das verstehe ich jetzt irgendwie garnicht mehr. Ändere bitte mal die Batchdatei:
Code:
Bleibt der Fehler dann bestehen?
echo Start Deines Programmes
d: cd D:\Delphi\Projekte\PrintSave\V1.15\ Alarmanlage.exe set myError= 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:
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.
starte formcreate
beende formcreate |
Re: SQL Fehler, wenn Exe in Autostart
Hallo nahpets,
Zitat:
Zitat:
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:
und wie man sieht, kann es nicht der Firebird Dienst sein, weilprocedure 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');
Delphi-Quellcode:
der ist ja 4 also gestartet. Aber woher kommt der Fehler, Klicke ich die ShowMessage Meldungen nur langsam durch, so ala
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
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: |
Re: SQL Fehler, wenn Exe in Autostart
Füge mal ein 'Application.Processmessages;' in Deine Warteschleife ein. // Grüße // Martin
|
Re: SQL Fehler, wenn Exe in Autostart
Sorry, das hat leider auch nichts gebracht, hatte ich bereits probiert.
Trotzdem Danke Gruß Jens |
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. |
Re: SQL Fehler, wenn Exe in Autostart
Hallo,
Zitat:
Gruß Jens :gruebel: |
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:
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.
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; ... Für eine Fehlerprotokollierung schau bitte mal hier: ![]() Zitat:
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? ![]() oder ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 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