【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クラス作成で管理容易