【C#】【.NET】SQLiteのDBファイルのハンドルを掴んだままとなる
はじめに
C#でSQLiteを使用していたらハマったのでメモ。
SQLiteはSystem.Data.SQLiteを使用。
NuGet Gallery | System.Data.SQLite (x86/x64) 1.0.102
事象
SQLのコネクションをクローズしてもデータベースファイルのハンドルを掴んだままとなる。
事象詳細
using System; using System.Data.Linq; using System.Data.Linq.Mapping; using System.Data.SQLite; namespace ConsoleApplication1 { class Program { private const String DB_PATH = @"C:\Users\{ユーザー名}\Documents\Visual Studio 2015\Projects\ConsoleApplication1\company.db"; static void Main(string[] args) { InsertTable(); Console.WriteLine("この時点でDBファイルのハンドルを掴んだまま"); } static void InsertTable() { SQLiteConnectionStringBuilder connectionBuilder = new SQLiteConnectionStringBuilder { DataSource = DB_PATH, }; SQLiteConnection connection = new SQLiteConnection(connectionBuilder.ToString()); connection.Open(); using (DataContext context = new DataContext(connection)) { Table<Company> table = context.GetTable<Company>(); table.InsertOnSubmit(new Company() { companyId = 0, companyName = "Google", }); context.SubmitChanges(); } connection.Clone(); } } [Table(Name = "company")] public class Company { [Column(Name = "company_id", DbType = "INT", CanBeNull = false, IsPrimaryKey = true)] public Int32 companyId { get; set; } [Column(Name = "company_name", DbType = "NVARCHAR", CanBeNull = false, UpdateCheck = UpdateCheck.Never)] public String companyName { get; set; } } }
問題点
テスト実施時に、初期化でDBファイルを作成して、終了処理でDBファイルを消したいのに消せない。
結論
解決策なし、上記のことを実現したいなら、DBファイルの中身のテーブルをDropするなどで対応する。
考察
解決策なしに至った確固たる根拠はありません。 チーム内で問題提起しても解決策が見つからず、DBの本質を考えるとファイルを削除できる必要がなく、中身のDropをするべきなのではないか、となった。