【C#からSQLite接続】Database接続のクラスを作成したので管理が容易になった

C#.NET

ad2

【C#からSQLite接続】Database接続のクラスを作成したので管理が容易になった

DB-SQLite & C#

広く活用されているデータベースといえば、SQLiteですね。

SQLiteをC#から接続する方法と、DBクラスを作成しましたので、

こんな感じにすると管理が容易になるよっていう話です。

SQLite-GUI

DB管理者はGUI管理だと楽ですよね。そこで、今回は、

DB Browser for SQLite

を使用します。

使い方は、他のサイトへ。

C#-Nugetパッケージ管理からインストール

では、C#でSQLiteに接続する方法です。

今回は、C#のWindowsForm開発の.NetFramework4.8での場合でご紹介します。

4.8以前のVer.でもいけると思います。

プロジェクトを作成したら、Nugetパッケージ管理を開いて、参照タブにして、

「system.data.sqlite」と検索してみましょう。

検索結果から「System.Data.SQLite」をインストールします。

sqlite_packages

インストールできたら今回の要である、DB制御クラスを作成します。

DB制御クラス作成

プロジェクト名選択して右クリックメニュー⇒追加⇒新しい項目で

新規にクラスファイルを作成します。

sqlite_calss_new_create

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

sqlite_class_name_add

クラスファイルを開いて、コードを書いていきます。

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文実行でテーブル内のレコード数(件数)を取得させる。

画面設計は下記の図のようにしました。

sqlite_screen_prod

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ではテーブル作成を下記の図のようなテーブル定義にしました。

sqlite_create_table

create table文を載せておきます。

CREATE TABLE “TEST” (
“no” INTEGER,
“name” TEXT,
“remarks” TEXT,
“flag1” INTEGER,
PRIMARY KEY(“no”)
)

完成したプログラムを起動してテーブル内容がデータグリッドに表示されます。

sqlite_before_seen

select_countボタンをクリックすると3件と出てきます。

次にInsertボタンをクリックするとレコードが1つ追加されます。

Select_Viewボタンをクリック、Select_countボタンもクリックするとデータ内容と件数が表示されます。

sqlite_after_seen

他のデータベースでも同様な感じにクラスを作成して使い回せます。

OracleやPostgresQLでの例も記事にして書いてます。

ご参考に。

Oracleバージョン

【C#&OracleDB接続】Database接続クラス作成して管理が容易で開発効率UP

PostgresQLバージョン

【C#&PostgreSQL接続】Database-controlクラス作成で管理容易