セージ の メモ書き

メモこそ命の恩人だ

SQLite してみる

SQLite ( エスキューライト )

https://www.sqlite.org

SQLite入門 | DBOnline

オープンソースのデータベース / SQLiteとは

  • 軽量なRDBMS。( エンジンのサイズは1M程度 )
  • OSSである。( パブリックドメイン状態 )
  • ライブラリとして動作する。( SQL Server のように単体で動作するものではない。つまり、クラサバの構成には向いてない。)
  • 組込み製品、小規模システム用のDBとして使用することが多いらしい。
  • トランザクション機能にも対応してる。

管理ツール

C# での使用

  • Nuget より "System.Data.SQLite" をインストールするだけ。
    • SQL Server のように OS にエンジンをインストールする必要がなく、簡単に環境構築できる。
    • ちなみに、EntityFramework が不要なら System.Data.SQLite.Core のみインストールする。
  • SQLite の使用時は「using System.Data.SQLite;」の指定が必要。

DB生成

  • DBの生成は SQLiteConnection クラスで行える。
  • コンストラクタに接続文字列を設定する。
  • 接続時にDBが存在しなければ、自動生成される。

こんな感じ。

// SampleDb.sqlite に接続する。
var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;");
connection.Open();
connection.Close();

// 実行後、EXE のカレントに SampleDb.sqlite が生成されたことを確認。

テーブル生成

  • "CREATE TABLE" の SQL を実行するだけ。
  • SQLiteCommand クラスで SQL を定義できる。
  • ExecuteNonQuery メソッドで SQL を実行できる。

こんな感じ。

using (var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;"))
{
    connection.Open();
    var sql = "CREATE TABLE Person2 (Id int primary key, Name varchar(10), Age int)";
    var command = new SQLiteCommand(sql, connection);
    command.ExecuteNonQuery();
}

// 管理ツールで指定したテーブルが作成できたことを確認。
// ちなみに再度同じ処理を実行すると、同名のテーブルが存在するため、以下の例外が発生した。
// System.Data.SQLite.SQLiteException: 'SQL logic error table Person already exists'

CRUD 操作 ( SQL )

  • Insert / Update / Delete は、ExecuteNonQuery メソッドを使用する。
  • Select は、ExecuteReader メソッドを使用する。実行後、Read メソッドで False が返るまで取得し続ける。

こんな感じ。

// Insert
using (var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;"))
{
    connection.Open();
    var sql = "INSERT INTO Person (Id, Name, Age) values (1, 'Suzuki', 20);";
    var command = new SQLiteCommand(sql, connection);
    command.ExecuteNonQuery();
}
// 管理ツールにて、データを追加できたことを確認。
// Update
using (var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;"))
{
    connection.Open();
    var sql = "UPDATE Person SET Name = 'Yamada', Age = 30 WHERE Id = 1;";
    var command = new SQLiteCommand(sql, connection);
    command.ExecuteNonQuery();
}
// 管理ツールにて、データを更新できたことを確認。
// Delete
using (var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;"))
{
    connection.Open();
    var sql = "DELETE FROM Person WHERE Id = 1;";
    var command = new SQLiteCommand(sql, connection);
    command.ExecuteNonQuery();
}
// 管理ツールにて、データを削除できたことを確認。
// Select
using (var connection = new SQLiteConnection("Data Source=SampleDb.sqlite;Version=3;"))
{
    connection.Open();
    var sql = "SELECT * FROM Person;";
    var command = new SQLiteCommand(sql, connection);
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Debug.Write($"{reader["Id"]} {reader["Name"]}  {reader["Age"]} {Environment.NewLine}");
        }
    }
}
// 1 Suzuki  20
// 2 Yamada  30

// SELECT でデータを取得できたことを確認。

CRUD 操作 ( EntityFramework )

準備

  • Nuget より "System.Data.SQLite" をインストールすること。( Core のみだと、EntityFramework がない。)
  • App.config に以下の修正を加える。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
   ....
   <entityFramework>
      <providers>
         <!-- ↓変更↓ ( ”EF6" を消すだけ。) -->
         <!--<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />-->
         <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
         <!-- ↑変更↑ -->
   
   ...
   
   <!-- ↓追加↓ (connectionString には DB 名をセット) -->
   <connectionStrings>
      <add name="Sample" connectionString="Data Source=SampleDb.sqlite;" providerName="System.Data.SQLite" />
   </connectionStrings>
   <!-- ↑追加↑-->
</configuration>
  • Peson クラスを追加する。
  • 主キーの Id プロパティに以下の DatabaseGenerated 属性を付与しないと、Insert に失敗する。
[Table("Person")]
public class Person
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
  • DbContext クラスを追加する。
public class SampleDbContext : DbContext
{
    public DbSet<Person> Person { get; set; }
    
    // App.config に追加した connectionStrings を参照する。
    public SampleDbContext() : base("name=Sample") {}
}

本題

こんな感じ。

// Insert
using (var dbContext = new SampleDbContext())
{
    var person = new Person() { Id = 1, Name = "Suzuki", Age = 20 };
    dbContext.Person.Add(person);
    dbContext.SaveChanges();
}
// データを追加できたことを確認。
// Update + Select
using (var dbContext = new SampleDbContext())
{
    var person = dbContext.Person.FirstOrDefault();
    person.Name = "Tanaka";
    dbContext.SaveChanges();
}
// データを取得し、そのデータを更新できたことを確認。
// Delete + Select
using (var dbContext = new SampleDbContext())
{
    var person = dbContext.Person.FirstOrDefault();
    dbContext.Person.Remove(person);
    dbContext.SaveChanges();
}
// データを取得し、そのデータを削除できたことを確認。


以上😃