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

C#.NET

ad2

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

oracle

データベースで有名なのがoracleですね。

今回は、Oracle Database Express Edition 11gr2のデータベースを使用します。

無償で商用利用可なので良いのですが、制限がありますので、詳細はググって下さい。

最近はOracleDB18c XE版も出たみたいですね。

18cからDB構造が変わってるのでご注意を。

GUIで管理したい方は、「Oracle SQL Developer」をダウンロードして下さい。

テーブル作成

今回のサンプルでは下記の通りのテーブル定義を作成しました。

oracle_db_table_create

テーブル名:sample

カラム3つは、ID,NAME,REMARKSです。

IDに列シーケンス設定します。(自動インクリメント設定)

C#-DataAccess.dll追加

今回は、C#での.NETFramework4.8でwindowsform開発を行います。

プロジェクトを作成したら、参照の追加から、Oracleがインストールされているディレクトリを探すと、Oracle.DataAccess.dllがあるのでそれを追加します。

oracle_db_dll_add

C#-画面設計

では、今回のプログラムの画面設計はというと、

oracle_db_screen_prod

ボタンを3つ配置、labelを配置、DataGridViewを配置しました。

C#-DB制御クラス作成

では、Oracle.DataAccess.dllを追加したら、

クラスを作成します。

oracle_class_name_add

空のクラスで名前は任意。今回は、Dbctl.csを作成します。

クラス内容のソースコードは下記の通りです。

using Oracle.DataAccess.Client;

namespace OracleSQL
{
    class Dbctl
    {
        private readonly OracleConnection conn;

        public Dbctl(string dbUser, string dbPass)
        {
            string conn_str = "User Id=" + dbUser + "; " + "Password=" + dbPass + ";";

            conn = new OracleConnection(conn_str);

            conn.Open();
        }

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

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

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

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

            return reader;
        }

    }
}

using Oracle.DataAccess.Client;を参照追加します。

  • OracleConnection   —DB接続
  • OracleCommand   –SQL文作成
  • OracleDataAdapter  –データ取得格納(一括取得) ->データグリッドビューに表示させるなど。
  • OracleDataReader  –データ取得

これらを主に使って、SQL文を実行していきます。

C#-メイン処理

今回は、テーブルデータを表示させることと、データ挿入、データ取得をするプログラムを作成しました。

using Oracle.DataAccess.Client;
using System;
using System.Data;
using System.Windows.Forms;

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

        //データベース接続情報
        private const string DATABASE_USER = "testuser";
        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)
        {
            OraTableSelect_class();
        }


        public void OraTableSelect_class()
        {

            //DB制御class
            Dbctl dbctl = new Dbctl(DATABASE_USER, DATABASE_PASSWORD);

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

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

        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string cmd_str1 = "INSERT INTO SAMPLE (name, remarks) VALUES('DDD', '04')";
            string cmd_str2 = "INSERT INTO SAMPLE (name, remarks) VALUES('EEE', '05')";
            string cmd_str3 = "INSERT INTO SAMPLE (name, remarks) VALUES('FFF', '06')";
            Ora_insert(cmd_str1);
            Ora_insert(cmd_str2);
            Ora_insert(cmd_str3);
        }

        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="cmd_str"></param>
        public void Ora_insert(string cmd_str)
        {
            //DB制御class
            Dbctl dbctl = new Dbctl(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)
        {
            Ora_select();
        }

        /// <summary>
        /// Select_count
        /// </summary>
        public void Ora_select()
        {
            //DB制御class
            Dbctl dbctl = new Dbctl(DATABASE_USER, DATABASE_PASSWORD);

            try
            {
                string cmd_str = "SELECT Count(*) FROM sample";

                OracleDataReader reader = dbctl.ExecuteQueryReader(cmd_str);

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

using Oracle.DataAccess.Client;を追加しています。

結果

プログラムを実行する前に、ビルド設定で対象プラットフォームをx64に設定しておいて下さい。

oracle_x64_select

プログラムを実行すると、テーブル内容がDatagridViewに表示されます。最初に3つデータを入れておきました。

Select_countボタンを押下すると、「3」とレコード件数が表示されます。

oracle_db_before_screen

次に、Insertボタン押下⇒Select_Viewボタン押下⇒Select_countボタン押下を行った結果が下記の通りです。

oracle_db_after_screen

プログラム通りに3つのレコードが挿入された結果が表示されました。

テーブル定義設定でIDカラム列は、シーケンス設定してありましたので、自動インクリメントされています。

その他

他のデータベースでも同様な感じでDB制御クラスを作成してあげれば、管理が容易になり、開発効率も上がり、コードも見やすく、読みやすくなります。

SQLite

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

PostgreSQL

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