![]() |
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:
Bei dem folgenden Code denke ich, zu wissen, das folgendes passiert. Ist die QryActiv oder der Fehler Größer 5 werden. falls
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; vorhanden Fehlermeldungen ausgegeben. Aber nur in dem Fall von Error <5. Bei Activer Qry wid das Programm fortgesetzt.
Delphi-Quellcode:
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.
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; Danke aber schon mal Gruß Jens |
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:
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?
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; 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:
wäre wohl besser:
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;
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; |
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:
Im Anhang, habe ich die Datei, in der allrdings nur 1 mal Net Start enthalten ist. Ich habe mit der
if not QryMB256PLUS.Active then begin
iError := 0; //DeleteFile('c:\netstart.txt'); // eine temporäre Logdatei, kann bei Funktion des Programmes entfallen. Repeat
Delphi-Quellcode:
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.
WinExec('CMD.EXE /C "net start >> c:\netstart.txt"',SW_HIDE);
Gruß Jens |
Re: SQL Fehler, wenn Exe in Autostart
Ich habe übrigens mal ein
Delphi-Quellcode:
vor das schreiben der Datei gepackt, und das wir auch nur einmal ausgeführt.
ShowMessage(IntToStr(iError));
|
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:
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.
net start >> c:\netstart.txt
WinExec ist nur zum Start eines anderen Programmes da und hat keinen Einfluß auf das Erstellen der Datei. |
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. ![]() 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) |
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:
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.
Servername:pfadangabe
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. |
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. |
Re: SQL Fehler, wenn Exe in Autostart
Zitat:
|
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 01:46 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