Sicherung einer SQLite-Datenbank

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

Hallo,

ich möchte gerne eine SQLite-Datenbank (Name: bt.b) mit folgendem Befehl innerhalb eines Lazarus-Projekts per Klick auf einen Button sichern:

Code: Alles auswählen

procedure TForm1.BTSicherungDBClick(Sender: TObject);
begin
    CopyFile('K:\MyMemoDB\Dt\bt.b','C:\Textx\bt_ok.b');
end;

Es erscheint die Fehlermeldung. "Unable to open file "K:\MyMemoDB\Dt\bt.t"
Was mache ich falsch? (Ich möchte die Datenbank ja gar nicht öffnen, nur das gesamte File "bt.b" gesamt kopieren)

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von Socke »

Der bessere Ansatz wäre wohl, die SQLite-Backup-API zu verwenden. Andernfalls musst du sicherstellen, dass während du die Kopie machst, die Datenbank in Ordnung ist (d.h. keine offenen Transaktionen) und kein anderer Prozess schreibend auf die Datenbank zugreift.
Aliobaba hat geschrieben:Es erscheint die Fehlermeldung. "Unable to open file "K:\MyMemoDB\Dt\bt.t"
Das ist ungewöhnlich. CopyFile() sollte nur mit den Dateien arbeiten, die du angibst. Überprüfe nochmal die Pfadangaben und die Berechtigungen des Benutzers bezüglich Dateien erstellen usw.
Aliobaba hat geschrieben:(Ich möchte die Datenbank ja gar nicht öffnen, nur das gesamte File "bt.b" gesamt kopieren)
Um eine Datei zu kopieren, musst du sie zuerst öffnen, dann auslesen und das Gelesene in eine andere Datei schreiben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

Hallo,

Danke für die schnelle Antwort:

Der Befehl müßte schon richtig sein: Wenn ich eine Datei xy.z generiere wird diese ordentlich als bt_ok.b in das andere Verzeichnis kopiert, wenn ich nur die Zeile

Code: Alles auswählen

CopyFile('K:\MyMemoDB\Dt\bt.b','C:\Textx\bt_ok.b');
mit dieser:

Code: Alles auswählen

CopyFile('K:\MyMemoDB\Dt\xy.z','C:\Textx\bt_ok.b');
austausche. (xy.z ist ja auch nicht "offen")

Aliobaba

(Mein "Werk" ist hier: http://www.lazarusforum.de/viewtopic.php?f=11&t=6079" onclick="window.open(this.href);return false; )
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

Hallo,

diese Batch-Datei auf "DOS-Ebene" würde funktionieren:

Code: Alles auswählen

Copy K:\MyMemoryDB\Dt\bt.b C:\Textx\
Kann man so einen Batch Befehl in den Code einbauen? Wie?

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

Sorry! Hab's gefunden: (Weiß zwar nicht warum, aber es funktioniert)

Code: Alles auswählen

{ShellApi}
procedure TForm1.Button1Click(Sender: TObject);  
begin
 ShellExecute(Handle, 'open',
 'Memory_Copy.bat', nil, nil, SW_SHOWNORMAL);
end;
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von Antrepolit »

@Aliobaba:
Unter Windows 7 kannst du (im Normalfall) nicht (ohne Weiteres) direkt auf C:\ (bzw. das Windows-Laufwerk) schreiben aus einem Programm raus.
Grüße, Antrepolit

care only if your os is really burning

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

Hallo Antrepolit,

"bt.b" ist meine SQLite Datenbank, "xy.z" ist ein beliebig erzeugtes File.
Vom Programm aus wird "xy.z" abgespeichert, "bt.b" nicht. (??) s.o.
Die Batch-Datei wird aber aufgerufen und "abgearbeitet". Damit bin ich eigentlich zufrieden.
Warum "bt.b" mit der genannten Fehlermeldung nicht gespeichert wird, auch wenn ich die ZConnection vorher schließe.. ??

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von gocher »

Mal eine kurze Zwischenfrage,wieso nutzt Du nicht CopyFile Funktion aus der Unit Windows (eine Kernel32 Funktion)?

Code: Alles auswählen

bFunzt := CopyFile(PChar('k:\Source.db'), PChar('C:\Dest.db'), false);
Die funktioniert besser :) !

Vorher sollte aber Sqlite3Dataset1.Active := false; gesetzt werden!
Zuletzt geändert von gocher am Fr 6. Jul 2012, 21:24, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von Socke »

Aliobaba hat geschrieben:Warum "bt.b" mit der genannten Fehlermeldung nicht gespeichert wird, auch wenn ich die ZConnection vorher schließe.. ??
Aliobaba hat geschrieben:Es erscheint die Fehlermeldung. "Unable to open file "K:\MyMemoDB\Dt\bt.t"
Weil hier versucht wird eine andere Datei zu kopieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von Antrepolit »

:D Socke hat recht! :D +1
Grüße, Antrepolit

care only if your os is really burning

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Sicherung einer SQLite-Datenbank

Beitrag von gocher »

Antrepolit hat geschrieben::D Socke hat recht! :D +1
Hast Du es denn noch mal mit der anderen CopyFile Funktion versucht wäre doch schöner als über Batch?

Code: Alles auswählen

bFunzt := CopyFile(PChar('k:\Source.db'), PChar('C:\Dest.db'), false);
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Sicherung einer SQLite-Datenbank

Beitrag von Aliobaba »

... Ja, Vielen Dank!
Funktioniert sehr gut. :D

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten