C#でSQLiteを試してみる。「サムネイルを管理するテーブルを作る」

C# コンピュータ
C#

管理テーブルの定義

テーブル名:thumbnail

項目名備考
idINTEGER主キー、自動採番、サムネイルの番号
filenameTEXT重複不可、サムネイルの元画像
lastmodifiedTEXT元画像の更新日時

プロジェクトの作成

dotnet new console --name プロジェクト名
cd プロジェクト名
dotnet add package System.Data.SQLite

ソースコード

namespace _01_thumbnail_db;

using System.ComponentModel;
using System.Data.Common;
using System.Data.SQLite;

/*
 サムネイルテーブルの定義
*/
class ThumbnailTbl
{
    public long id = 0;
    public string? filename;
    public string? lastmodified;
}

class Program1
{
    // データベースファイル
    const string DB_FILE = @".\thumnail.db";
    // コネクションオブジェクトの生成
    static SQLiteConnection conn = new();

    /*
     データベースと接続
    */
    static void ConnectDatabase()
    {
        // 接続文字列をセット
        conn.ConnectionString = $"Data Source = {DB_FILE}";
        // データベースを開く
        conn.Open();
        // コマンドオブジェクトを作成
        using var cmd = new SQLiteCommand(conn);
        // テーブルを作成
        cmd.CommandText = "CREATE TABLE IF NOT EXISTS thumbnail (id  INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT, lastmodified TEXT);";
        cmd.ExecuteNonQuery();
        // インデックスを作成
        cmd.CommandText = "CREATE UNIQUE INDEX IF NOT EXISTS filenameindex ON thumbnail(filename);";
        cmd.ExecuteNonQuery();
    }
    /*
     thumbnailテーブルからデータを取得
    */
    static bool GetThumbnailOne(ref ThumbnailTbl record)
    {
        bool result = false;
        using var cmd = new SQLiteCommand(conn);

        string? filename = record.filename;
        cmd.CommandText = $"SELECT id, filename, lastmodified FROM thumbnail where filename = '{filename}'";
        using var rec = cmd.ExecuteReader();
        if (rec.Read()) {
            result = true;
            record.id = (long)rec["id"];
            record.filename = (string)rec["filename"];
            record.lastmodified = (string)rec["lastmodified"];
        }
        return result;
    }
    /*
     thumbnailテーブルへデータを追加・更新
    */
    static bool UpdateThumbnailOne(ref ThumbnailTbl record)
    {
        using var cmd = new SQLiteCommand(conn);

        // データベースのサムネイル情報を取得
        ThumbnailTbl old = new()
        {
            filename = record.filename,
        };
        if (GetThumbnailOne(ref old)) {
            // サムネイル情報がある場合・更新

            // 更新日時が同じ場合
            if (old.lastmodified == record.lastmodified) {
                // idをセットして
                record.id = old.id;
                // リターン
                return true;
            }
            
            cmd.CommandText = $"UPDATE thumbnail SET lastmodified = '{record.lastmodified}' WHERE filename = '{record.filename}'";
        } else {
            // サムネイル情報がない場合・追加
            cmd.CommandText = $"INSERT INTO thumbnail (filename, lastmodified) values ('{record.filename}','{record.lastmodified}')";
        }
        cmd.ExecuteNonQuery();
        // 更新結果を取得
        return GetThumbnailOne(ref record);
    }
    static void Main()
    {
        // 画像ファイルのディレクトリ
        const string tartgetDir = @"C:\Users\karet\Pictures";

        // データーベースへ接続
        ConnectDatabase();

        // 画像の一覧を取得
        var files = Directory.EnumerateFiles(tartgetDir, "*.jpg", SearchOption.TopDirectoryOnly);
        foreach(var file in files) {
            var fi = new FileInfo(file);
            ThumbnailTbl rec = new()
            {
                filename = file,
                lastmodified = fi.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
            };
            // テーブルを更新
            UpdateThumbnailOne(ref rec);
            // 結果を表示
            Console.WriteLine($"{rec.id} {rec.filename} {rec.lastmodified}");
        }

        // コネクションを切断
        conn.Close();
    }
}

実行結果

6 C:\Users\karet\Pictures\1696088459254.jpg 2023-10-01 07:12:25
7 C:\Users\karet\Pictures\1696088459254_thumbnail.jpg 2024-01-16 19:42:11
8 C:\Users\karet\Pictures\202310010715.jpg 2023-10-01 07:16:03
9 C:\Users\karet\Pictures\202310010715_thumbnail.jpg 2024-01-14 08:25:43
10 C:\Users\karet\Pictures\202402282245.jpg 2024-02-28 22:45:33
11 C:\Users\karet\Pictures\IMG_20240121_081702754_MFNRs.jpg 2024-01-21 09:19:10
12 C:\Users\karet\Pictures\IMG_20240228_224115510_MFNR.jpg 2024-02-28 22:43:26
13 C:\Users\karet\Pictures\IMG_20240302_181544629_MFNR.jpg 2024-03-02 18:21:55

とりあえずテーブル作成、追加、更新、参照を作りました。これで画像ファイルの作成、更新に対応させたいと思います。
画像ファイルが削除された場合は、そのまま何もしない仕様とします。

コメント