【C#&OracleDB接続】Database接続クラス作成して管理が容易で開発効率UP
oracle
データベースで有名なのがoracleですね。
今回は、Oracle Database Express Edition 11gr2のデータベースを使用します。
無償で商用利用可なので良いのですが、制限がありますので、詳細はググって下さい。
最近はOracleDB18c XE版も出たみたいですね。
18cからDB構造が変わってるのでご注意を。
GUIで管理したい方は、「Oracle SQL Developer」をダウンロードして下さい。
テーブル作成
今回のサンプルでは下記の通りのテーブル定義を作成しました。

テーブル名:sample
カラム3つは、ID,NAME,REMARKSです。
IDに列シーケンス設定します。(自動インクリメント設定)
C#-DataAccess.dll追加
今回は、C#での.NETFramework4.8でwindowsform開発を行います。
プロジェクトを作成したら、参照の追加から、Oracleがインストールされているディレクトリを探すと、Oracle.DataAccess.dllがあるのでそれを追加します。

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

ボタンを3つ配置、labelを配置、DataGridViewを配置しました。
C#-DB制御クラス作成
では、Oracle.DataAccess.dllを追加したら、
クラスを作成します。

空のクラスで名前は任意。今回は、Dbctl.csを作成します。
クラス内容のソースコードは下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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#-メイン処理
今回は、テーブルデータを表示させることと、データ挿入、データ取得をするプログラムを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
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に設定しておいて下さい。

プログラムを実行すると、テーブル内容がDatagridViewに表示されます。最初に3つデータを入れておきました。
Select_countボタンを押下すると、「3」とレコード件数が表示されます。

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

プログラム通りに3つのレコードが挿入された結果が表示されました。
テーブル定義設定でIDカラム列は、シーケンス設定してありましたので、自動インクリメントされています。
その他
他のデータベースでも同様な感じでDB制御クラスを作成してあげれば、管理が容易になり、開発効率も上がり、コードも見やすく、読みやすくなります。
SQLite
PostgreSQL