【SQLite】C#windowsFormsでSQLiteを使用してデータベース活用アプリを開発

C#.NET

ad2

【SQLite】windowsFormsでSQLiteを使用してデータベース活用アプリを開発

NuGetパッケージ

まずは、SQLiteを使用するためNugetパッケージの管理から「SQLite」と検索して、

「System.Data.SQLite.Core」をインストールしよう。

 

SQLite-vs-Nuget SQLite-nuget2

インストールし終わったら、プロジェクトフォルダ配下に「packages」フォルダが作成されて、

その中にNuGetでインストールされたパッケージが入る。

画面設計

今回は、下記の図の通り、画面を作成してみました。

app-sqlite-test

Database作成&テーブル作成&データ登録&データ取得

早速、ソースコードを載せます。

データベース作成、テーブル作成、データ登録、データ取得できるアプリを作成しました。

using System;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;

namespace SQLite_Database
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //DB作成
        private SQLiteConnection conn = new SQLiteConnection("Data Source = SQLite.db"); // 「●●.db」でデータベースファイルが作成される.  実行ファイルと同じフォルダ内に生成。
        //private SQLiteConnection conn = new SQLiteConnection(@"Data Source = C:\work\SQLite.db"); // 「●●.db」でデータベースファイルが作成される.  絶対パスで置き場所指定もできる。

        /// <summary>
        /// ボタンクリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                //DBを開く
                conn.Open();

                //SQL文作成
                SQLiteCommand command = conn.CreateCommand();

                //SQL文作成 テーブル作成 書き方は様々
                //command.CommandText = "create table IF NOT EXISTS TEST (id, name, remarks)";                                                           //全て文字列型で設定される.
                command.CommandText = "create table IF NOT EXISTS TEST (id integer PRIMARY KEY AUTOINCREMENT, name, remarks)";                           //id カラム列をプライマリーキーに設定.
                //command.CommandText = "create table IF NOT EXISTS TEST (id integer PRIMARY KEY AUTOINCREMENT, name varchar(30), remarks varchar(200))"; //各カラムの型を設定しバイト容量を設定.

                //クエリ実行
                command.ExecuteNonQuery();

                textBox1.Text = "DB作成&テーブル作成完了.";
            }
            catch (Exception ex)
            {
                //エラーをテキストボックスに表示
                textBox1.Text = ex.Message;
            }
            finally
            {
                //DB閉じる
                conn.Close();
            }

        }


        /// <summary>
        /// レコード追加ボタンクリックイベント Insert文
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {

            //データを用意
            string name1 = "AAA";
            string name2 = "BBB";
            string name3 = "CCC";
            string remarks1 = "hogehoge1";
            string remarks2 = "hogehoge2";
            string remarks3 = "hogehoge3";

            try
            {
                //DBを開く
                conn.Open();

                //SQL文作成
                SQLiteCommand command = conn.CreateCommand();

                //SQL文作成 テーブル作成
                command.CommandText = "insert into TEST (name, remarks) values('" + name1 + "', '" + remarks1 + "')";

                //クエリ実行
                command.ExecuteNonQuery();

                //SQL文作成 テーブル作成
                command.CommandText = "insert into TEST (name, remarks) values('" + name2 + "', '" + remarks2 + "')";

                //クエリ実行
                command.ExecuteNonQuery();

                //SQL文作成 テーブル作成
                command.CommandText = "insert into TEST (name, remarks) values('" + name3 + "', '" + remarks3 + "')";

                //クエリ実行
                command.ExecuteNonQuery();

                //結果表示
                textBox2.Text = "データ登録完了.";
            }
            catch (Exception ex)
            {
                //エラーをテキストボックスに表示
                textBox2.Text = ex.Message;
            }
            finally
            {
                //DB閉じる
                conn.Close();
            }
        }


        /// <summary>
        /// データ取得ボタンクリックイベント SELECT文
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, EventArgs e)
        {
            try
            {
                //DBを開く
                conn.Open();

                //SQL文作成
                SQLiteCommand command = conn.CreateCommand();

                //SQL文作成 テーブル作成
                command.CommandText = "select * from TEST";

                //クエリ実行
                
                
                //◆データを1レコードずつ取得していく場合
                
                SQLiteDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    richTextBox1.Text += reader[0].ToString() + reader[1].ToString() + reader[2].ToString();   //引数index番号は、カラム順 [0]:id [1]:name [2]:remarks
                }


                //◆データを一括で取得してDataGridViewに表示する場合
                
                SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from TEST", conn);
                
                DataSet Ds = new DataSet();      //データセットインスタンス作成
                DataTable dt = new DataTable();  //データテーブルインスタンス作成
                adapter.Fill(dt);                //データテーブルに代入
                Ds.Tables.Add(dt);               //データセットに追加

                dataGridView1.DataSource = Ds.Tables[0]; //グリッドビューにデータ表示

                //結果表示
                textBox3.Text = "データ取得完了."; 
            }
            catch (Exception ex)
            {
                //エラーをテキストボックスに表示
                textBox3.Text = ex.Message;
            }
            finally
            {
                //DB閉じる
                conn.Close();
            }
        }
    }
}

 

実行結果表示

ビルドして実行すると、下記のような結果が表示される。

sqlite_execute_sample

カレントフォルダにDB作成

DBは、カレントディレクトリーに生成される。

exe_folder

DB置き場所指定

DBの置き場所を指定したい場合は、絶対パスで指定してあげればいい。

SQLiteConnection conn = new SQLiteConnection(@"Data Source = C:\work\SQLite.db");
db_sitei_create

まとめ

SQLiteは、簡単にデータベース構築できる。Androidアプリにもよく用いられている。

クライアントサーバーアプリケーションには使えない。。スタンドアロン向け(組み込み等)です。

他のOracleDB,H2DB,PostgresQLなどのDBも同じ要領で実装できるので、試してみては。