まだ中学生のブログ

スマホ関連、Google関連のことを書いてます。IT系勤務、既婚、精神年齢:中学生。

【C#】【.NET】SQLiteのDBファイルのハンドルを掴んだままとなる

はじめに

C#でSQLiteを使用していたらハマったのでメモ。

SQLiteはSystem.Data.SQLiteを使用。

NuGet Gallery | System.Data.SQLite (x86/x64) 1.0.102

事象

SQLのコネクションをクローズしてもデータベースファイルのハンドルを掴んだままとなる。

事象詳細

f:id:madachugakusei:20160823093518p:plain

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をするべきなのではないか、となった。