C#でSQLiteを試してみる。

C# コンピュータ
C#
データの保存にデータベースが欲しくなる場面があります。さりとて大掛かりになりがちなDBMSインストールは避けたいところです。特に一人の人間しか使わないアプリケーションソフトであれば、多人数からのアクセスによる排他処理などをそれほど気せず、とりあえずSQLが使えれば概ね要件がすむ場合が多いです。そのような場合重宝するのがSQLiteです。多くのプラットフォームに対応しているらしいのでC#でも使えると思われますので試してみたいと思います。

プロジェクトの作成

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

プロジェクトファイルを覗いてみたところパッケージが追加されていました。

  <ItemGroup>
    <PackageReference Include="System.Data.SQLite" Version="1.0.115.5" />
  </ItemGroup>

これだけで準備完了です。後はC#のプログラムでデータベースをいじってい見たいとお思います。

サンプルプログラムソース

using System.Threading.Tasks.Dataflow;
using System;
using System.Data.SQLite;

namespace sqlite01
{
    class Program
    {
        static void Main(string[] args)
        {
            // データベースファイル
            var dbPath = @"H:\csharp\sqlite01\sample.db";

            // コネクションオブジェクトの生成
            using (var conn = new SQLiteConnection() )
            {
                // 接続文字列をセット
                conn.ConnectionString = string.Format("Data Source = {0}", dbPath);

                // データベースを開く
                conn.Open();

                using(var cmd = new SQLiteCommand(conn))
                {
                    var result = 0;

                    // テーブルを作成
                    cmd.CommandText = "CREATE TABLE IF NOT EXISTS sample (id int, name text, primary key(id))";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("CREATE TABLE:{0}", result);

                    // レコードの追加
                    cmd.CommandText = "INSERT INTO sample (id, name) values (1,'hanako')";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("INSERT:{0}", result);

                    cmd.CommandText = "INSERT INTO sample (id, name) values (2,'taro')";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("INSERT:{0}", result);

                    // レコードの更新
                    cmd.CommandText = "UPDATE sample SET name = 'jiro' WHERE id = 2";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("UPDATE:{0}", result);

                    // レコードの削除
                    cmd.CommandText = "DELETE FROM sample WHERE id = 1";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("DELETE:{0}", result);

                    // レコードの参照
                    cmd.CommandText = "SELECT id, name FROM sample";
                    using (var rec = cmd.ExecuteReader())
                    {
                        while(rec.Read())
                        {
                            Console.WriteLine("id:{0} name:{1}", rec["id"], rec["name"]);
                        }
                    }
                    
                    // テーブルの削除
                    cmd.CommandText = "DROP TABLE IF EXISTS sample;";
                    result = cmd.ExecuteNonQuery();
                    Console.WriteLine("DROP TABLE:{0}", result);
                }
            };
        }
    }
}

結果

CREATE TABLE:0
INSERT:1
INSERT:1
UPDATE:1
DELETE:1
id:2 name:jiro
DROP TABLE:1
以前PowerShellで作成したサンプルプログラムをC#のコンソールアプリとして書き直してみました。同じ結果となりましたので動作に問題はなさそうです。

追記
レコードの参照でvar rec = cmd.ExecuteReader()のrecはSQLiteDataReaderでファイルを開いた状態のハンドルみたいな物でrec.Read()を実行することで最初の1件目が読み込めます。
rec.Read()の戻り値は次の行がある場合trueそうで無い場合falseとなりwhileで回すことで最後の行まで読みだせます。
ちなみにrecのHasRowsプロパティで行の有無が確認出来ます。

コメント