Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FreePascal Mit SQLite verbinden, wenn Prog mit Windows startet? (https://www.delphipraxis.net/182803-mit-sqlite-verbinden-wenn-prog-mit-windows-startet.html)

AlexII 19. Nov 2014 11:49

Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3Connection

Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe folgendes Problem: wenn ich meine Anwendung mit Windows über die Registry starten lasse, kann diese sich irgendwie nicht mit der DB Verbinden bzw. die SQLite3Connection nicht laden. Die Fehlermeldung heißt, siehe Screenshot. Sleep mit mehrere Minuten hilft auch nicht, es kann also nicht an dem liegen, dass Windows noch nicht alle Dienste geladen hat.

Dieser Code hilft auch nicht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
  var
  i: Integer;
begin
  if FileExists('D:\myProg\db.db') then
  begin

    for i := 0 to 1 do
    begin

      if SQLite3Connection1.Connected then
      begin
        ShowMessage('Verbunden!');
      end
      else begin
        ShowMessage('Nicht verbunden!');
        Sleep(20000);
        SQLite3Connection1.Open;
      end;

    end;
  end else ShowMessage('DB-Datei nicht vorhanden!');
end;
Bin für jede Hilfe dankbar!

Der schöne Günther 19. Nov 2014 13:03

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von AlexII (Beitrag 1280319)
es kann also nicht an dem liegen, dass Windows noch nicht alle Dienste geladen hat

Da wäre ich mir spontan nicht so sicher: Ich kann jetzt nicht herauslesen, ob die sqlite.dll statisch gelinked oder dynamisch eingebunden wird. In ersterem Fall könnte es ja vielleicht sein, dass direkt bei Anwendungsstart durch das Einbinden der DLL irgendwelche Initialisierungsdinge ablaufen und für die ist es noch viel zu früh sodass alles was später darauf aufbaut, fehlschlägt.

Bekommst du in der gleichen laufenden Anwendung denn später die Datenbank noch auf?

AlexII 19. Nov 2014 13:14

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1280328)
Zitat:

Zitat von AlexII (Beitrag 1280319)
es kann also nicht an dem liegen, dass Windows noch nicht alle Dienste geladen hat

Da wäre ich mir spontan nicht so sicher: Ich kann jetzt nicht herauslesen, ob die sqlite.dll statisch gelinked oder dynamisch eingebunden wird. In ersterem Fall könnte es ja vielleicht sein, dass direkt bei Anwendungsstart durch das Einbinden der DLL irgendwelche Initialisierungsdinge ablaufen und für die ist es noch viel zu früh sodass alles was später darauf aufbaut, fehlschlägt.

Bekommst du in der gleichen laufenden Anwendung denn später die Datenbank noch auf?


Ja manuell startet es immer. Manuell kann ich es sofort nach der Anmeldung starten, automatisch startet es auch nach Minuten nicht.

Der schöne Günther 19. Nov 2014 13:22

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Nein, das meine ich nicht. Ich meinte: Dein Programm im Registry-Autostart. Es bekommt im ersten Anlauf die DB nicht auf. Wenn du es nicht beendest, was ist dann? Kriegt man die Datenbank etwas später doch noch auf?

AlexII 19. Nov 2014 13:25

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1280337)
Nein, das meine ich nicht. Ich meinte: Dein Programm im Registry-Autostart. Es bekommt im ersten Anlauf die DB nicht auf. Wenn du es nicht beendest, was ist dann? Kriegt man die Datenbank etwas später doch noch auf?

Ja das bekomme ich auf, wird wohl von keinem Prozess belegt.

himitsu 19. Nov 2014 13:26

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Grundsätzliche Probleme, welche es geben könnte:

das Arbeitsverzeichnis -> FileExists geht auf absoluten Pfad, aber was ist bei der Connection eingestellt?
Und warum nimmt FileExist nicht einfach den Pfad von der Connection? (doppelte Buchhaltung)

fehlende Rechte -> Wie genau wird dein Programm gestartet?
Das WIE hat auch einfluss auf das Arbeitsverzeichnis.

AlexII 19. Nov 2014 13:36

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das wird wie folgt in die Registry aufgenommen:

Delphi-Quellcode:
// Anwendung in die Registry aufnehmen
procedure DoAppToRun(RunName, AppName: String);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  with Reg do
   try
    begin
     RootKey := HKEY_CURRENT_USER;
     OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     WriteString(RunName, AppName);
     CloseKey;
    end;
   Finally
   Free;
  end;
end;

...
DoAppToRun('Joblist', ParamStr(0));
...
So sieht da der Eintrag aus, siehe Screenshot.

AlexII 19. Nov 2014 14:22

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Ich hab's... :-D

Nachdem ich die DB-Komponenten im Objektinspektor auf Werkseinstellung gesetzt habe und die ganzen Einstallungen im Code festgelegt habe, läuft alles wie geschmiert.

Delphi-Quellcode:
SQLite3Connection1.DatabaseName := 'D:\myProg\db.db';
SQLTransaction1.DataBase := SQLite3Connection1;
SQLQuery1.Transaction := SQLTransaction1;

Auf die visuellen Komponente kann man sich also nicht immer verlassen, oder wie kann man das hier erklären?

Andreas L. 19. Nov 2014 19:50

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von AlexII (Beitrag 1280345)
Auf die visuellen Komponente kann man sich also nicht immer verlassen, oder wie kann man das hier erklären?

Das liegt sehr wahrscheinlich daran, dass beim aufrufen deines Codes (in FormCreate) die Eigenschaften der Komponenten (also auch SQLite3Connection1.DatabaseName) noch nicht (alle) gesetzt bzw. aus der DFM geladen wurden. Und das sleep() hilft nicht, weil der Lade-/Init-Vorgang nicht parallel zu FormCreate abläuft. D. h. sleep, etc. verzögert dies...

Sir Rufo 19. Nov 2014 19:58

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Ist eigentlich der typische Fehler, wenn die Anwendung erzeugt wird und die Active-Eigenschaft im OI auf
Delphi-Quellcode:
true
belässt.

Bevor FormCreate aufgerufen wird, werden alle Komponenten erzeugt und die Eigenschaften gesetzt (Active=true), tja was passiert dann wohl, wenn der Pfad zur DB nicht stimmt ;)

Also eigene Schludrigkeit ;)

Der schöne Günther 19. Nov 2014 20:02

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
FireDAC kann zwischen Designzeit und Laufzeit unterscheiden. So kann man trotzdem immer ein "Active = True" in der IDE haben, dort testen und alles, im kompilierten Programm ist es dann aber nicht vom Start weg aktiv.

Das nur am Rande.

AlexII 19. Nov 2014 20:54

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1280412)
Ist eigentlich der typische Fehler, wenn die Anwendung erzeugt wird und die Active-Eigenschaft im OI auf
Delphi-Quellcode:
true
belässt.

Bevor FormCreate aufgerufen wird, werden alle Komponenten erzeugt und die Eigenschaften gesetzt (Active=true), tja was passiert dann wohl, wenn der Pfad zur DB nicht stimmt ;)

Also eigene Schludrigkeit ;)


Das habe ich jetzt nicht verstanden... was habe ich falsch gemacht? :roll:

Sir Rufo 19. Nov 2014 21:10

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Wenn du dein Programm zusammenklickst und ein paar Komponenten auf die Form wirfst und dann bei diesen Komponenten etwas einstellst, wie merkt sich das erzeugte Programm das wohl?

Genau, diese Eigenschaften werden gespeichert (wenn abweichend vom Standardwert).

Und wann werden die geladen?

Genau, immer dann wenn die Form erzeugt wird.

Und nun haben wir da eine Datenbank-Verbindungs-Komponente wo die Eigenschaft Active auf True steht. Was passiert dann beim Erstellen?

Genau, da wird dann die Verbindung geöffnet ... und wenn der Pfad nicht passt, ja dann knallt es eben (so wie erlebt).

Und da das alles vor dem Aufruf von
Delphi-Quellcode:
TForm.OnCreate
passiert, kannst du dort reinschreiben was du willst.

AlexII 19. Nov 2014 21:20

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1280426)
Genau, da wird dann die Verbindung geöffnet ... und wenn der Pfad nicht passt, ja dann knallt es eben (so wie erlebt).

Aber der Pfad hat ja immer gestimmt! Oder meinst Du der Pfad gehört in den Code und soll nicht im OI eingetragen werden?

Und außerdem wenn ich das Prog manuell starte funkt doch alles, nur beim Autostart nicht. Und den Unterschied habe ich immer noch nicht verstanden. Wenn ich was falsch mache, dann muss es doch manuell und automatisch nicht funktionieren. Beides nein, oder beides ja. :roteyes:

Der schöne Günther 19. Nov 2014 21:58

AW: Mit SQLite verbinden, wenn Prog mit Windows startet?
 
Ja, das wundert mich jetzt ehrlich gesagt auch.

Ist das nur bei der sqLite-Datenbank so? Oder tritt das auch auf, wenn du eine einfache Textdatei aus dem gleichen Verzeichnis wie die DB öffnen wolltest?

Gibt
Delphi-Quellcode:
ParamStr(0)
vielleicht etwas besonderes aus? Kannst du das mal mitloggen?


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