6

バックエンドが sqlite の C# アプリケーションを開発しています。私のアプリケーションには、データベースを消去するためのボタンがあります (.db ファイルを削除し、初期データを使用して再度作成します)。データベースを削除しようとすると、別のプロセスで使用されているため削除できないと表示されることがあります。それを削除する前に、私はクローズ接続、破棄、およびプール機能のクリアを使用しています。それでも同じ例外がスローされます。これが私のコードです:

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

create 関数で、次のコードを定義します。ここからエラーが発生します。

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

エラーがスローされないようにするにはどうすればよいですか?

4

7 に答える 7

4
FileInfo fi = new FileInfo(DatabasePath);
try
{
    if (fi.Exists)
    {
        SQLiteConnection connection = new SQLiteConnection("Data Source=" + DatabasePath + ";");
        connection.Close();
        GC.Collect();
        GC.WaitForPendingFinalizers();
        fi.Delete();
    }
}
catch(Exception ex)
{
    fi.Delete();
}

DatabasePathはデータベース ファイル パスです。

于 2020-07-12T14:53:17.493 に答える
2
ThingzDatabase.localdb.conn.ClearAllPools(); 

私が信じるその線の呼びかけであるべきです。

于 2011-12-15T23:09:42.830 に答える
2

私は自分自身に質問をするだけに なりました。解決策は、ガベージ コレクションを少し実行することでした。

于 2011-12-16T16:15:59.830 に答える
1

API から返されたものをまだ破棄していないと思います。

どの sqlite ラッパーを使用していますか? カスタム関数の使用を引用していますが、それらは何をしますか?

于 2011-12-10T13:38:23.303 に答える
1

接続文字列では、この Pooling=False; を使用します。私はプーリングで同じ問題を抱えていました。

于 2012-01-03T13:38:06.157 に答える
-1

Mark Russinovich によるこのような procmon を使用できます。
次に、ファイル名に基づいて表示をフィルタリングできます。
これが完了すると、どのプロセスがこのファイルをロックしているかを正確に確認し、それに応じてデバッグできます。

于 2011-12-15T23:12:15.233 に答える