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

C#.NET

ad2

【C#&PostgreSQL接続】Database-controlクラスを作成したので管理が容易になった

DB-PostgreSQL

C#.NETFramework開発でPostgreSQLを使用したい方向けにDB制御クラスを作成したので、ご紹介します。

今回は、.NET Framework4.8で開発しています。4.xでも使用できると思います。

PostgreSQLインストール

インストールする場合は、

PostgreSQL」からダウンロードして下さい。今回はPostgreSQL13を使用します。

GUI管理したい場合は、標準でインストールされる「PgAdmin4」を使用して下さい。他にもDBViewerは検索すれば有りますのでお好きなものを使用すればいいと思います。

PostgreSQL-テーブル作成

テーブルを作成しておきます。

今回は、DB名「test」をcreate databaseしておきました。

テーブル内容は下記の通りです。

create table SAMPLE (
id integer,
name varchar(10),
remarks varchar(10)
);

C#-Form画面設計

Form画面を作成します。

プロジェクトを作成したら、画面にDatagridviewとボタン3つとlabelを配置します。

postgres_screen_prod

C#-Nugetパッケージ管理

C#でPostgreSQLを使用したい場合、dllパッケージをインストールしておきます。

Nugetパッケージ管理を開いて、参照タブから「Npgsql」と検索します。

postgresql_nuget_packagesjpg npgsql_packages

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

C#-DBcontrolクラス作成

では、要であるDB制御クラスを作成していきます。

新しい項目をクリックしてクラスを選択、クラス名は任意です。今回は、「Dbctl.cs」として作成しました。

npgsql_class_new_create postgresql_class_name_add

下記がクラス内容です。

using Npgsql;

namespace ProgresQL
{
    class Dbctl
    {
        private readonly NpgsqlConnection conn;

        public Dbctl(string dbServer, string dbName, string dbPort, string dbUser, string dbPass)
        {
            string conn_str = "Server=" + dbServer + ";Port=" + dbPort + ";User ID=" + dbUser + ";Database=" + dbName + ";Password=" + dbPass + ";Enlist=true";

            conn = new NpgsqlConnection(conn_str);

            conn.Open();
        }

        //接続子を設定
        public void Close()
        {
            conn.Close();
            conn.Dispose();
        }

        public void ExecuteNonQuery(string sql)
        {
            NpgsqlCommand sqlCom = new NpgsqlCommand(sql, conn);
            sqlCom.ExecuteNonQuery();
        }

        public NpgsqlDataAdapter ExecuteQueryAdapter(string sql)
        {
            NpgsqlDataAdapter Adapter = new NpgsqlDataAdapter(sql, conn);
            return Adapter;
        }

        public NpgsqlDataReader ExecuteQueryReader(string sql)
        {
            NpgsqlCommand sqlCom = new NpgsqlCommand(sql, conn);
            NpgsqlDataReader reader = sqlCom.ExecuteReader();

            return reader;
        }
    }
}

using Npgsql;を参照追加してあります。

  • NpgsqlConnection   -接続
  • NpgsqlCommand    -クエリ実行
  • NpgsqlDataAdapter  -データ取得格納 (データ一括取得的な感じ)
  • NpgsqlDataReader  -データ取得

この辺が主に使われるものです。

Formメイン処理

では、画面起動時処理やボタンクリックイベントを作成していきます。

using Npgsql;
using System;
using System.Data;
using System.Windows.Forms;

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

        //接続子を設定
        public string conn_str = "Server=localhost;Port=5555;User ID=postgres;Database=postgres;Password=asahi001;Enlist=true";     //Enlist	既存のトランザクションへの自動参加の有効/無効を設定(Ttue/False)

        //データベース接続情報
        private const string DATABASE_SERVER = "localhost";
        private const string DATABASE_NAME = "test";            //"postgres"; デフォルト
        private const string DATABASE_PORT = "5555";
        private const string DATABASE_USER = "postgres";
        private const string DATABASE_PASSWORD = "extralab";

        /// <summary>
        /// Form起動時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //select_View
            PgTableSelect();
        }

        /// <summary>
        /// テーブル全件検索表示
        /// </summary>
        private void PgTableSelect()
        {
            //DB制御class
            Dbctl dbctl = new Dbctl(DATABASE_SERVER, DATABASE_NAME, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD);

            try
            {
                string strSQL = "SELECT * From SAMPLE";

                NpgsqlDataAdapter 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>
        /// Select_View
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            PgTableSelect();
        }

        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string cmd_str = "INSERT INTO SAMPLE VALUES(4, 'DDD', 'test4')";
            Pg_insert(cmd_str);

            //複数行一括でInsertしたい場合
            string cmd_str2 = "INSERT INTO SAMPLE VALUES(5, 'EEE', 'test5'),(6, 'FFF', 'test6'),(7, 'GGG', 'test7')";
            Pg_insert(cmd_str2);
        }


        public void Pg_insert(string cmd_str)
        {
            //DBctlclass
            Dbctl dbctl = new Dbctl(DATABASE_SERVER, DATABASE_NAME, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD);


            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)
        {
            Pg_select();
        }

        /// <summary>
        /// select
        /// </summary>
        public void Pg_select()
        {
            //DB制御class
            Dbctl dbctl = new Dbctl(DATABASE_SERVER, DATABASE_NAME, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD);

            try
            {
                //指定テーブル内のレコード件数取得select文
                string cmd_str = "SELECT Count(*) FROM SAMPLE";

                NpgsqlDataReader reader = dbctl.ExecuteQueryReader(cmd_str);

                while (reader.Read())
                {
                    label1.Text = reader[0].ToString();  //全件数検索結果表示
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                dbctl.Close();
            }
        }
    }

}

Select_Viewボタンで、データグリッドビューにテーブル内容を表示させます。

Insertボタンでデータ挿入します。

Select_Countでテーブルのデータ件数を取得します。

結果

プログラム実行して、Select_Countボタンを押下すると、

postgresql_before_seen

3件のデータを入れておきましたので、3件データ表示されます。

Insertボタンを押下すると、

postgresql_after_seen

ソースコードを見ればわかると通り、2つのIsert文を実行しているのでidが4~7のレコードが挿入されました。

select_countボタンを押下して7件と取得できました。

その他

基本的な事ができたので、あとは、SQL文を修正していってデータ処理をしていけば、いいだけです。

Dbctlクラスを作成したおかげで、メイン処理コードがスッキリして読みやすくなったと思っています。

自分で試行錯誤していって下さい。

他のデータベースでも同様なことができます。

SQLite

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

Oracle

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