読者です 読者をやめる 読者になる 読者になる

SQLiteにDapperで読み書きする

C# SQLite プログラミング

C#SQLite読み書きするときに使うORMを探していたところ、Dapper.NetというORMを見つけた。

github.com

このDapper.Netがとても使いやすかったので紹介がてら、使い方のメモを残そうかと思う。

事前準備

  1. Nugetから「Depper dot net」をインストールする
  2. Nugetから「System.Data.SQLite」をインストールする

  3. 以下のような「user」テーブルを作成します。

CREATE TABLE user(
  id integer primary key,
  name text,
  age integer
);

SELECT文

とりあえずまずはSELECTができる事を確かめてみる。
先ほど定義したuserテーブルに適当なデータを3件ほど挿入しておく。

上記のUserテーブルを格納するクラスを作成する。
プロパティ名称はテーブル定義のカラム名称と合わせ、integer型の主キーはlong?で定義する。

public class User
{
    public long? ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

usingを追加する

using Dapper;

SELECT文を投げる処理を追加する。

public static IEnumerable<User> GetAll()
{
    var config = new SQLiteConnectionStringBuilder() 
    {
        DataSource = @"..\..\..\testdb.db" 
    };
    using (var connection = new SQLiteConnection(config.ToString()))
    {
        connection.Open();
        return connection.Query<User>(@"select * from user");
    }
}

プロパティメンバーを表示するためのToStringを追加する。

public override string ToString()
{
    return string.Format("ID={0}, Name={1}, Age={2}", ID, Name, Age);
}

SELECTしたデータを表示してみる

static void Main(string[] args)
{
    User.GetAll().ForEach(x => Console.WriteLine(x));

    Console.ReadKey();
}

ちゃんとデータが取得できた。

f:id:hkou:20150719082404p:plain

INSERT文

SELECT処理と被るので、コネクションを返す部分をメソッドに分割する

private static SQLiteConnection GetConnection()
{
    var config = new SQLiteConnectionStringBuilder()
    {
        DataSource = @"..\..\..\testdb.db"
    };
    return new SQLiteConnection(config.ToString());
}

Insert処理
値は「@名前」形式で指定する。

public static void Insert(User user)
{
    using (var connection = GetConnection())
    {
        connection.Open();
        using (var tran = connection.BeginTransaction())
        {
            try { 
                connection.Execute("insert into user(name, age) values(@name, @age)", user, tran);
                tran.Commit();
            }
            catch (Exception)
            {
                tran.Rollback();
            }
        }
    }
}

UPDATE文

UPDATE文もInsert文と同じくExecuteメソッドを呼び出して実行する。

public static void UpdateById(User user)
{
    using (var connection = GetConnection())
    {
        connection.Open();
        using (var tran = connection.BeginTransaction())
        {
            try
            {
                connection.Execute("update user set name=@name, age=@age where id=@id", user, tran);
                tran.Commit();
            }
            catch (Exception)
            {
                tran.Rollback();
            }
        }
    }
}