【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を作成します。
クラス内容のソースコードは下記の通りです。
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に設定しておいて下さい。
プログラムを実行すると、テーブル内容がDatagridViewに表示されます。最初に3つデータを入れておきました。
Select_countボタンを押下すると、「3」とレコード件数が表示されます。
次に、Insertボタン押下⇒Select_Viewボタン押下⇒Select_countボタン押下を行った結果が下記の通りです。
プログラム通りに3つのレコードが挿入された結果が表示されました。
テーブル定義設定でIDカラム列は、シーケンス設定してありましたので、自動インクリメントされています。
その他
他のデータベースでも同様な感じでDB制御クラスを作成してあげれば、管理が容易になり、開発効率も上がり、コードも見やすく、読みやすくなります。
SQLite
PostgreSQL
【C#&PostgreSQL接続】Database-controlクラス作成で管理容易