データの保存にデータベースが欲しくなる場面があります。さりとて大掛かりになりがちな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プロパティで行の有無が確認出来ます。
コメント