【C#からSQLite接続】Database接続のクラスを作成したので管理が容易になった
DB-SQLite & C#
広く活用されているデータベースといえば、SQLiteですね。
SQLiteをC#から接続する方法と、DBクラスを作成しましたので、
こんな感じにすると管理が容易になるよっていう話です。
SQLite-GUI
DB管理者はGUI管理だと楽ですよね。そこで、今回は、
を使用します。
使い方は、他のサイトへ。
C#-Nugetパッケージ管理からインストール
では、C#でSQLiteに接続する方法です。
今回は、C#のWindowsForm開発の.NetFramework4.8での場合でご紹介します。
4.8以前のVer.でもいけると思います。
プロジェクトを作成したら、Nugetパッケージ管理を開いて、参照タブにして、
「system.data.sqlite」と検索してみましょう。
検索結果から「System.Data.SQLite」をインストールします。

インストールできたら今回の要である、DB制御クラスを作成します。
DB制御クラス作成
プロジェクト名選択して右クリックメニュー⇒追加⇒新しい項目で
新規にクラスファイルを作成します。

クラスを選択してクラス名を任意で決めて追加します。

クラスファイルを開いて、コードを書いていきます。
DB_クラス
クラス内容は下記の通りになります。
参照追加でusing System.Data.SQLite;を追加しています。
using System.Data.SQLite;
namespace SQLite_SQL
{
class Dbctl
{
private readonly SQLiteConnection conn;
public Dbctl(string dbname)
{
string conn_str = "Data Source=" + dbname + ";";
conn = new SQLiteConnection(conn_str);
conn.Open();
}
public void Close()
{
conn.Close();
conn.Dispose();
}
public void ExecuteNonQuery(string sql)
{
SQLiteCommand sqlCom = new SQLiteCommand(sql, conn);
sqlCom.ExecuteNonQuery();
}
public SQLiteDataAdapter ExecuteQueryAdapter(string sql)
{
SQLiteDataAdapter Adapter = new SQLiteDataAdapter(sql, conn);
return Adapter;
}
public SQLiteDataReader ExecuteQueryReader(string sql)
{
SQLiteCommand sqlCom = new SQLiteCommand(sql, conn);
SQLiteDataReader reader = sqlCom.ExecuteReader();
return reader;
}
}
}
Open()、Close()のメソッドがあり、その他には、
ExecuteNonQueryは、Insert文、Create文、Delete文、Alter文、などのクエリで結果を返さないSQL文などを実行するときに使用します。コード見ての通り、returnがないで返り値がないです。
SQLiteDataAdapterは、select文などでAdapterでまとめてデータを取得するときに使用します。データセットに入れてデータテーブルからデータグリッドにデータを表示させるときなどに使います。returnがありデータを返します。
SQLiteDataReaderは、select文などでデータを取得してそのデータを1つずつや1行ずつ編集取得していくことができて、データ分析するときなどはこちらを主に使います。こちらもreturnがありデータを返します。
詳しくないので、詳細はググって下さい。
文字列にしている”Data Source=~~~~”は、扱うDBの種類によって変わります。
それぞれのDB接続子をご確認下さい。
今回は、SQLiteでの例です。
Form
それでは、画面設計とクリックイベントなどのソースコードを載せていきます。
今回は、ボタンを3つ設置、データグリッド設置、ラベル設置して、下記の処理を書いていきます。
- Select文実行でテーブル内容をデータグリッドに表示させる。
- Insert文実行でレコード追加させる。
- Select文実行でテーブル内のレコード数(件数)を取得させる。
画面設計は下記の図のようにしました。

using System;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;
namespace SQLite_SQL
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//データベース接続情報
private const string DATABASE_NAME = "SAMPLE.db";
//---Table_create----------
// CREATE TABLE "TEST" (
// "no" INTEGER,
// "name" TEXT,
// "remarks" TEXT,
// "flag1" INTEGER,
// PRIMARY KEY("no")
// )
//-------------------------
/// <summary>
/// Form起動時処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
SqliteTableSelect_class();
}
/// <summary>
/// Select_View
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
SqliteTableSelect_class();
}
/// <summary>
/// Select_View
/// </summary>
public void SqliteTableSelect_class()
{
//DB制御class
Dbctl dbctl = new Dbctl(DATABASE_NAME);
try
{
string strSQL = "SELECT * From TEST";
SQLiteDataAdapter Adapter = dbctl.ExecuteQueryAdapter(strSQL);
DataSet Ds = new DataSet(); //データセットインスタンス作成
DataTable dt = new DataTable(); //データテーブルインスタンス作成
Adapter.Fill(dt); //データテーブルに代入
Ds.Tables.Add(dt); //データセットに追加
dataGridView1.DataSource = Ds.Tables[0]; //グリッドビューにデータ表示
}
catch (Exception exception)
{
MessageBox.Show("DB_select_table_view:\n" + exception.Message, "Error");
}
finally
{
dbctl.Close();
}
}
/// <summary>
/// Insert
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string cmd_str1 = "INSERT INTO TEST (name, remarks, flag1) VALUES('DDD1', 'memo4', 1)";
Sqlite_insert(cmd_str1);
}
/// <summary>
/// Insert
/// </summary>
/// <param name="cmd_str"></param>
public void Sqlite_insert(string cmd_str)
{
//DbctlClass
Dbctl dbctl = new Dbctl(DATABASE_NAME);
try
{
dbctl.ExecuteNonQuery(cmd_str);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
dbctl.Close();
}
}
/// <summary>
/// Select_Count
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
Sqlite_select();
}
/// <summary>
/// Select_Count
/// </summary>
public void Sqlite_select()
{
//DB制御class
Dbctl dbctl = new Dbctl(DATABASE_NAME);
try
{
string cmd_str = "SELECT Count(*) FROM TEST";
SQLiteDataReader reader = dbctl.ExecuteQueryReader(cmd_str);
while (reader.Read())
{
label1.Text = reader[0].ToString(); //全件数検索結果表示
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
dbctl.Close();
}
}
}
}け
using System.Data.SQLite;を追加して、SQL実行するときにDbctl.csを呼び出して活用する方法をご紹介しました。
SQLiteを使用したプロジェクトにDbctl.csクラスファイルを追加すればいいだけなので、容易に展開でき、管理も楽で、コードもスッキリしてコードレビューする際も見やすい。
結果
今回のSQLiteではテーブル作成を下記の図のようなテーブル定義にしました。

create table文を載せておきます。
CREATE TABLE “TEST” (
“no” INTEGER,
“name” TEXT,
“remarks” TEXT,
“flag1” INTEGER,
PRIMARY KEY(“no”)
)
完成したプログラムを起動してテーブル内容がデータグリッドに表示されます。

select_countボタンをクリックすると3件と出てきます。
次にInsertボタンをクリックするとレコードが1つ追加されます。
Select_Viewボタンをクリック、Select_countボタンもクリックするとデータ内容と件数が表示されます。

他のデータベースでも同様な感じにクラスを作成して使い回せます。
OracleやPostgresQLでの例も記事にして書いてます。
ご参考に。
Oracleバージョン
PostgresQLバージョン
【C#&PostgreSQL接続】Database-controlクラス作成で管理容易