.NET で SQLite を使ってみます。
過去に書いたい着くかの記事のまとめです。
今回の流れ
- NuGet からパッケージインストール
- データベースファイルを作って
- テーブルを作って
- テーブルの定義を読んで
- データを Insert して
- データを Select します
NuGet からパッケージインストール
今回使うライブラリを NuGet からインストールしてください。
データベースファイルを作る
データベースファイルはカレントディレクトリに Data Source で指定したファイル名で作成されます。
カレントディレクトリを変更することで、ファイルが作成される場所を変更できます。
例えば次のようにすることで、カレントディレクトリの下の data というディレクトリの中に database.db というファイル名で作成できます。
using (var connection = new SqliteConnection("Data Source=data/database.db"))
テーブルを作る
データベースとして使うためにはまずはテーブルを作らなければなりません。
まあ特別なことはなく、次の一文を実行するだけです。
CREATE TABLE IF NOT EXISTS saitama ( no INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL );
C# 上で実行するコードは次のような感じです。
command.CommandText = "CREATE TABLE IF NOT EXISTS saitama ( no INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);";
command.ExecuteNonQuery();
テーブルの定義を読む
アプリの中でテーブルの定義を確認したいことは実は良くあります。
次のような一文を実行します。
PRAGMA TABLE_INFO ('saitama')
C# 上で実行するコードは次のような感じです。
Console.WriteLine("テーブルの情報");
command.CommandText = "PRAGMA TABLE_INFO ('saitama')";
using (var reader = command.ExecuteReader())
{
var dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.AsEnumerable())
{
foreach (DataColumn col in dt.Columns)
Console.Write($"{col.ColumnName}:{row[col.ColumnName]} ");
Console.WriteLine();
}
}
データを Insert する
今回、とりあえずデータの Select までをやりたいので、Select するためのデータを Insert します。
Insert ですから特別なことは何もないです。
insert into saitama values (1, 'せんべい');
C# 上で実行するコードは次のような感じです。
command.CommandText = "insert into saitama values (1, 'せんべい');";
command.ExecuteNonQuery();
データを Select する
データを Select します。やはり特別なことは何もないです。
select * from saitama where no = $no;
C# 上で実行するコードは次のような感じです。
command.CommandText = "select * from saitama where no = $no;";
command.Parameters.AddWithValue("$no", 1);
using (var reader = command.ExecuteReader())
{
var dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.AsEnumerable())
Console.WriteLine($"Saitama, {row["name"]}");
}
全体をつなげて実行できるコードにする
前述の要素たちをつなげて動作する一つのコードにまとめてみます。
もし試す際はこのコードをコピー&ペーストして試してください。
※要素間のつなぎや、複数回実行するときのためのコードで少し書き足しがあります。
using Microsoft.Data.Sqlite;
using System;
using System.Data;
using System.IO;
using System.Linq;
var directory = new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, "data"));
if (!directory.Exists) directory.Create();
var file = new FileInfo(Path.Combine(Environment.CurrentDirectory, "data", "database.db"));
if (file.Exists) file.Delete();
using (var connection = new SqliteConnection("Data Source=data/database.db"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "CREATE TABLE IF NOT EXISTS saitama ( no INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);";
command.ExecuteNonQuery();
Console.WriteLine("テーブルの情報");
command.CommandText = "PRAGMA TABLE_INFO ('saitama')";
using (var reader = command.ExecuteReader())
{
var dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.AsEnumerable())
{
foreach (DataColumn col in dt.Columns)
Console.Write($"{col.ColumnName}:{row[col.ColumnName]} ");
Console.WriteLine();
}
}
Console.WriteLine();
command.CommandText = "insert into saitama values (1, 'せんべい');";
command.ExecuteNonQuery();
Console.WriteLine("データの検索結果");
command.CommandText = "select * from saitama where no = $no;";
command.Parameters.AddWithValue("$no", 1);
using (var reader = command.ExecuteReader())
{
var dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.AsEnumerable())
Console.WriteLine($"Saitama, {row["name"]}");
}
}
実行結果
テーブルの情報
cid:0 name:no type:INTEGER notnull:1 dflt_value: pk:1
cid:1 name:name type:TEXT notnull:1 dflt_value: pk:0
データの検索結果
Saitama, せんべい
簡単ですね。
以前に書いた個々の要素
今回よりもう少し詳しく書いています。