Bonjour,
J'utilise un datasource et un Sqlite3Dataset pour travailler avec une petite base sqlite locale.
J'ai donc une base nommée disons... toto.s3db (c'est une base sqlite3 donc).
Tout fonctionne à merveille : grilles, suppressions, ajouts et j'en passe.
Donc c'est génial ... sauf que ...
J'aimerai que l'utilisateur puisse sauvegarder la base et la récuperer à volonté mais comme je suis un peu spécial je ne veux pas me servir du sql pour générer des scripts de sauvegarde/recuperation de base mais carrément faire du brut de décoffrage : un bon vieux FileCopy.
Enfin presque car j'utilise un FileCopy spécial donné ici même si je me souviens bien, à savoir celui-ci qui permet déjà de copier le fichier de ma base même ouverte dans un fichier :
Cela fonctionne parfaitement ainsi pour sauvegarder mon fichier toto.s3db en tout ce qu'on veut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Procedure TForm1.CopyFilePerso(Source: String; Dest: string); var SourceStream, DestStream: Classes.TFileStream; // source and dest file streams Begin DestStream := nil; // Open source and dest file streams SourceStream := Classes.TFileStream.Create(Source, SysUtils.fmOpenRead or SysUtils.fmShareDenyNone); // original used SysUtils.fmShareDenyWrite try DestStream := Classes.TFileStream.Create(Dest, Classes.fmCreate or SysUtils.fmShareExclusive); //DestStream := Classes.TFileStream.Create(Dest, Classes.fmCreate or SysUtils.fmShareDenyNone); // Copy file from source to dest DestStream.CopyFrom(SourceStream, SourceStream.Size); // Set dest file's modification date to same as source file SysUtils.FileSetDate(DestStream.Handle, SysUtils.FileGetDate(SourceStream.Handle)); finally // Close files DestStream.Free; SourceStream.Free; end; End;
Je me retrouve donc avec 10 belle sauvegardes dont le nom est xxxx-SAVE.s3db (oui je sais... 10 sauvegardes, je suis un type prudent limite parano... mais bon... qui peut le plus peut le moins donc l'utilisateur à la possibilité de faire autant de sauvegardes qu'il le désire).
Jusque là tout va bien... Mais je veux pouvoir aussi récupérer ces sauvegardes. Donc via un système de FileListBox et openDialog classique je récupère mon nom de fichier et je lui demande de faire un :
où mon fichierdepart représente le nom du ficheir de sauvegarde et fichierarrivee 'toto.s3db' (Comment ça 'le pauvre il veut écraser la base en cours' ? oO)
Code : Sélectionner tout - Visualiser dans une fenêtre à part CopyFilePerso(fichierdepart,fichierarrivee);
Donc pour pouvoir le faire je ferme ma jolie base toto par ceci :
(j'ai 2 datasource et Sqlite3Dataset pour travailler sur deux tables différentes)
Vous allez me dire 'Mais c'est quoi tous ces active:=false suivis de .close et de .free ?'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DatasourceToto1.Enabled:=false; DatasourceToto2.Enabled:=false; Sqlite3DatasetToto1.Active:=false; Sqlite3DatasetToto2.Active:=false; Sqlite3DatasetToto1.FileName:=''; Sqlite3DatasetToto2.FileName:=''; Sqlite3DatasetToto1.Close; Sqlite3DatasetToto2.Close; DatasourceToto1.free; DatasourceToto2.free; Sqlite3DatasetToto1.free; Sqlite3DatasetToto2.free;
Le fait est que je ne peux pas écraser ma base ! Alors je tente de fermer la connexion pour libérer le fichier de toutes les façons brouillonnes possible
Au moment de faire le CopyFilePerso j'ai un beau message d'erreur 'EFCreateError' qui à mon avis signifie que le fichier est toujours utilisé par quelqu'un
J'ai même tenté un
avant le filecopy mais vous pensez bien que j'ai le même problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DeleteFileUTF8(fichierarrivee);
Donc deux questions de newb doublé d'un bourrin, tant pis :
- Existe-t-il une autre façon de fermer la connexion à la base ? (je précise que rien n'est actif non plus sur mes Forms et que le résultat se produit sous IDE ou sous execution avec IDE fermé donc ça ne vient pas de là)
- Y aurait-il un parametre de la fonction CopyFilePerso à modifier dans le choix des fmxxxxxx ?
Merci aux bonnes âmes(Philippe ? jamais 2 sans 3 alors...
)
Patrick
Partager