【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クラス作成で管理容易