nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

SQLiteを用いて、WPFで登録・削除可能なリストを作成する[C#][WPF][Prism][MVVM][SQLite]

はじめに

SQLiteを用いて、WPFで登録・削除可能なリストを作成します。

大量のデータを永続化させるには、データベースを用いると楽です。

SQLiteを用いてデータを永続化させる方法について説明したいと思います。

SQLiteを用いたサンプルアプリ外観

f:id:nprogram:20180624141042p:plain

サンプルアプリクラス図

f:id:nprogram:20180624163314p:plain

SQLite 導入手順

Visual Studio 2017SQLiteを使用したいときは、プロジェクトにSQLiteを追加する必要があります。

SQLiteは、NuGetパッケージ マネージャーからプロジェクトに追加します。

https://www.nuget.org/packages/System.Data.SQLite/

以下はコマンドです。

Install-Package System.Data.SQLite -Version 1.0.108

SQLiteのデータべベースを生成する

以下のコードで実現できます。 SQLiteConnectionクラスに渡すString型の変数は、SQLiteConnectionStringBuilderクラスで作成するとよいでしょう。

[DataBaseManager.csの一部抜粋]

        private static readonly string FileName = @"BookList.db";
        private readonly string ConnectionString = null;
        private readonly string DataBaseFilePath = System.AppDomain.CurrentDomain.BaseDirectory + FileName;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DataBaseManager()
        {
            var builder = new SQLiteConnectionStringBuilder()
            {
                DataSource = FileName
            };

            ConnectionString = builder.ToString();
        }
        /// <summary>
        /// データベースを作成する
        /// </summary>
        public void CreateDataBase()
        {
            using (var connection = new SQLiteConnection(ConnectionString))
            {
                // データベースに接続
                connection.Open();
                // コマンドの実行
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "CREATE TABLE T_BOOKLIST(ID int PRIMARY KEY, Title string, Author string, Price int)";
                    command.ExecuteNonQuery();
                }
            }
        }

データベースの特定テーブルの全データを取得する

        public List<Book> GetDataBase()
        {
            var list = new List<Book>();

            using (var connection = new SQLiteConnection(ConnectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {
                    // データベースの接続開始
                    connection.Open();

                    // SQLの設定
                    command.CommandText = @"SELECT * FROM T_BOOKLIST";

                    // SQLの実行
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read() == true)
                        {
                            Int32.TryParse(reader["ID"].ToString(), out int id);
                            Int32.TryParse(reader["Price"].ToString(), out int price);

                            list.Add(new Book()
                            {
                                ID = id,
                                Title = reader["Title"].ToString(),
                                Author = reader["Author"].ToString(),
                                Price = price
                            });
                        }
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                    throw;
                }
            }
            return list;
        }

データベースにデータを追加する

        /// <summary>
        /// データベースにデータを追加する
        /// </summary>
        /// <returns></returns>
        public void AddDataBase(Book someBook)
        {
            var list = new List<Book>();

            using (var connection = new SQLiteConnection(ConnectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {
                    // データベースの接続開始
                    connection.Open();

                    // SQLの設定
                    command.CommandText = @"INSERT INTO T_BOOKLIST (ID, Title, Author, Price) VALUES (@ID, @Title, @Author, @Price)";
                    command.Parameters.Add(new SQLiteParameter("@ID", someBook.ID));
                    command.Parameters.Add(new SQLiteParameter("@Title", someBook.Title));
                    command.Parameters.Add(new SQLiteParameter("@Author", someBook.Author));
                    command.Parameters.Add(new SQLiteParameter("@Price", someBook.Price));
                    command.ExecuteNonQuery();
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                    throw;
                }
            }
        }

データベースの指定データを削除する

        /// <summary>
        /// データベースの指定データを削除する
        /// </summary>
        public void DelDataBase(Book someBook)
        {
            using (var connection = new SQLiteConnection(ConnectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {
                    // データベースの接続開始
                    connection.Open();

                    // SQLの設定
                    command.CommandText = @"DELETE FROM T_BOOKLIST WHERE ID=@ID";

                    command.Parameters.Add(new SQLiteParameter("@ID", someBook.ID));

                    // SQLの実行
                    command.ExecuteNonQuery();
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                    throw;
                }
            }
        }

データベースに格納されているデータの最大のIDを検索する

        /// <summary>
        /// データベースに格納する次のデータのID値を返す
        /// </summary>
        /// <remarks>
        /// データベースにデータがない場合は、戻り値として1を返す
        /// </remarks>
        /// <returns></returns>
        public int GetIDNextData()
        {
            var resultID = 0;

            using (var connection = new SQLiteConnection(ConnectionString))
            using (var command = connection.CreateCommand())
            {
                try
                {
                    // データベースの接続開始
                    connection.Open();

                    // SQLの設定
                    command.CommandText = @"SELECT MAX(ID) FROM T_BOOKLIST";

                    // SQLの実行
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read() == true)
                        {
                            resultID = reader.GetInt32(0);
                        }
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                }
            }

            return resultID + 1;
        }

ソースコード

テストアプリのソースコードを以下に置きました。 よろしければ、ダウンロードしてみてください。 github.com

参考リンク

garafu.blogspot.com

https://www.doraxdora.com/blog/2017/06/09/post-1184/

まとめ

SQLiteを用いると、データの取得・削除・検索が簡単にできるようになります。

ただし、現在のテストアプリでは、データベースをコントロールクラスが、特定の独自クラス専用になっているため、汎用的に使用するようにするには、さらに工夫が必要です。

以下のページがよさそうです。トランザクション処理も非常に勉強になります。

  • System.Data.SQLiteの自作ラッパクラス jikkenjo.net

あとがき

この後は、Webから取得した情報を表示することを試してみたいと思います。(Webスクレイピング)