2011-06-17 5 views
3

Je développe une application C# dont le backend est sqlite. Dans mon application, j'ai un bouton pour nettoyer la base de données (en supprimant le fichier .db et en le créant à nouveau avec quelques données initiales). Parfois, lorsque j'essaie de supprimer la base de données, elle ne peut pas être supprimée car elle est utilisée par un autre processus. Avant de le supprimer, j'utilise une connexion étroite, élimine et efface les fonctions de la piscine. Même alors, il jette la même exception. Voici mon code:Supprimer le fichier sqlite db

string targetDataBaseFilePath = Path.Combine(dataDirectoryPath, "local.db");    
ThingzDatabase.Create(targetDataBaseFilePath, "touchdb"); 

Dans la fonction de création je définis le code suivant, d'où je reçois l'erreur:

if (File.Exists(DatabaseFileName)) 
{ 
    try 
    { 
     ThingzDatabase.localdb.conn.Close(); 
     ThingzDatabase.localdb.conn.Dispose(); 
     SQLiteConnection.ClearAllPools(); 
    } 
    catch (Exception) 
    { 
    } 
    File.Delete(DatabaseFileName); //error throws from here.      
} 

Comment puis-je éviter l'erreur d'être jeté?

Répondre

-1

Je crois que vous n'avez toujours pas disposé de quelque chose retourné par API.

Quelle enveloppe sqlite utilisez-vous? Vous citez l'utilisation de vos fonctions personnalisées, que font-ils?

-1
ThingzDatabase.localdb.conn.ClearAllPools(); 

devrait être l'appel pour cette ligne je crois.

+0

Je vais volontiers écho! –

-1

Vous pouvez utiliser un procmon comme ceci one par Mark Russinovich.
Ensuite, vous pouvez filtrer l'affichage sur la base du nom de fichier.
Une fois cela fait, vous pouvez voir exactement quel processus verrouille ce fichier, et déboguer en conséquence.

-2

Je peux vous suggérer cela, juste une solution de contournement,

  1. Créer la nouvelle base de données et faire une entrée pour la même chose dans votre fichier de configuration par overwriting the exisiting config or Setting.Setting file.

  2. Clear all pools comme suggéré ci-dessus.

  3. Redémarrez votre application à l'aide Process.kill(name of your app exe) puis Process.start(your exe) en utilisant Process class

  4. rafraîchira la Redémarrage chaîne de connexion et fixez-le avec exe nouveau db.

  5. Enumerate all db except the newly created in the target dirs, et faire ce que vous voulez à l'aide FileInfo

2

J'ai fini juste demander moi-même question. La solution était de laisser fonctionner la collecte des ordures pendant un moment.

0

Dans la chaîne de connexion, utilisez Pooling = False; J'ai eu le même problème avec la mise en commun.

-1

Je vois beaucoup de choses avec les processus. Mais sqlite a une méthode pour cela. VIDE

The VACUUM command rebuilds the database file, repacking it into a minimal amount of disk space.

https://sqlite.org/lang_vacuum.html