【H2 DB】C#.NETでh2.dllとIKVM.NETを使用してWindowsFormアプリ開発で利用する方法

C#.NET

ad2

【H2 DB】C#.NETでh2.dllとIKVM.NETを使用してWindowsFormアプリ開発で利用する方法

H2 DataBase

H2DatabaseEngineのDB環境設定は今回は省きます。

まだH2DBを使ったことないという方は、H2 DataBaseEngineのサイトに飛んで見て下さい。軽量で簡単にDBが構築できるので試しに使ってみるのもいいかもしれませんよ。embeddedモード、serverモード両方利用できるのも特徴ですね。

僕のオススメポイントは、CSVファイルの読みRead書きwriteが簡単にコマンドで操作できるところですね。

H2DB Table

前提として、H2_TESTというDBにH2_TESTというテーブルを作成しておきます。

H2_test_table

《Table内容》カラム名:ID,NAME,CREATEDATE

Nuget

WindowsForm開発プロジェクトで「h2」を検索します。

h2_nuget

h2をインストールします。

参照

下記の図がh2のNugetをインストールすると、参照されるライブラリになります。

h2_sansyou

h2 Ver.

H2 DataBase EngineのVer.1.4.200のDBを構築していますが、

現在、Nugetからインストールできる「h2」は、バージョン:1.4.199

と記載されています。

バージョンに相違があっても今回のプログラムでは動きました。

h2_nuget_details

依存関係欄には、「Any,Version」と記載されているので、バージョンが違っても動作しそうですね。

ソースコード

今回の画面の設計は下記の図のように作成しています。

h2_test_screen_design

データベースを活用するならDataGridViewにデータを表示する機会は多いと思いますので、今回は、データ表示するようなソースコードを書いてみました。

using java.sql;
using System;
using System.Data;
using System.Windows.Forms;

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

        /// <summary>
        /// 画面起動時イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {

            // H2ドライバーload
            org.h2.Driver.load();

            // H2DB接続Connect
            Connection conn = Connect_logic();

            // H2DB接続Connect
            Createtable_logic(conn);

            // テーブル作成Create Table
            Insert_logic(conn);

            // 検索Select
            Select_logic(conn);

            // 接続閉じる.
            conn.close();

        }

        /// <summary>
        /// 接続ロジック
        /// </summary>
        /// <returns></returns>
        public Connection Connect_logic()
        {
            // H2DB接続Connect
            Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/G:/H2DB/DB/H2_TEST;", "sa", "sa");

            return conn;
        }

        /// <summary>
        /// テーブル作成ロジック
        /// </summary>
        /// <param name="conn"></param>
        public void Createtable_logic(Connection conn)
        {
            // テーブル作成Create Table
            PreparedStatement statement = conn.prepareStatement("CREATE TABLE IF NOT EXISTS TEST_INFO(id INT auto_increment, NAME varchar2(200), CREATEDATE timestamp);");
            statement.execute();

        }

        /// <summary>
        /// レコード登録ロジック
        /// </summary>
        public void Insert_logic(Connection conn)
        {
            // 現在時刻取得
            string dateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            // 登録Insert
            PreparedStatement statement2 = conn.prepareStatement("INSERT INTO  TEST_INFO(NAME, CREATEDATE) VALUES('EXTRA-LAB', '" + dateTime + "');");
            statement2.execute();

        }

        /// <summary>
        /// 検索&結果ロジック
        /// </summary>
        public void Select_logic(Connection conn)
        {
            // テキスト欄をクリア
            richTextBox1.Clear();

            // 検索Select
            PreparedStatement statement3 = conn.prepareStatement("SELECT * FROM TEST_INFO;");
            ResultSet set = statement3.executeQuery();

            // 結果データをDataGridに表示する
            DataSet ds = new DataSet();
            DataTable dt = new DataTable
            {
                TableName = "TEST_INFO",
            };

            // 3列定義します。
            dt.Columns.Add().ColumnName = "ID";
            dt.Columns.Add().ColumnName = "NAME";
            dt.Columns.Add().ColumnName = "CREATEDATE";

            // DataSetにdtを追加します。
            ds.Tables.Add(dt);

            // 全件数分繰り返し
            while (set.next())
            {
                DataRow row = ds.Tables[0].NewRow();

                row[0] = set.getInt(1);
                row[1] = set.getNString(2);
                row[2] = set.getNString(3);

                ds.Tables[0].Rows.Add(row);

                // 文字列連結
                string result = "ID:" + set.getInt(1) + " NAME:" + set.getNString(2) + " CREATEDATE:" + set.getNString(3) + "\n";

                // テキストボックスに表示する場合
                richTextBox1.AppendText(result);

            }

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

        }


        /// <summary>
        /// テーブル作成ボタン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // H2DB接続Connect
            Connection conn = Connect_logic();

            //テーブル作成ロジック実行
            Createtable_logic(conn);
        }

        /// <summary>
        /// レコード登録ボタン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            // H2DB接続Connect
            Connection conn = Connect_logic();

            //レコード登録ロジック実行
            Insert_logic(conn);
        }

        /// <summary>
        /// 結果表示ボタン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            // H2DB接続Connect
            Connection conn = Connect_logic();

            // 検索&結果表示ロジック実行
            Select_logic(conn);
        }

    }
}

結果

アプリ実行結果が下記の図のようになります。

h2_test_result_app

C#.NETでH2 Database Engineを操作できるようになりました。

これで、H2Databaseの活用方法が広がったと思います。

色々とシステム開発に役に立つのではないのでしょうか。

では。(@^^)/~~~