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 :

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;
Cela fonctionne parfaitement ainsi pour sauvegarder mon fichier toto.s3db en tout ce qu'on veut.

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CopyFilePerso(fichierdepart,fichierarrivee);
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)

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)

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;
Vous allez me dire 'Mais c'est quoi tous ces active:=false suivis de .close et de .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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
DeleteFileUTF8(fichierarrivee);
avant le filecopy mais vous pensez bien que j'ai le même problème.

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