SQLiteにDapperで読み書きする
C#でSQLite読み書きするときに使うORMを探していたところ、Dapper.NetというORMを見つけた。
このDapper.Netがとても使いやすかったので紹介がてら、使い方のメモを残そうかと思う。
事前準備
- Nugetから「Depper dot net」をインストールする
Nugetから「System.Data.SQLite」をインストールする
以下のような「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(); }
ちゃんとデータが取得できた。
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(); } } } }