C# オラクル接続してデータをDataTableに取得

オラクル接続/データ取得/切断までの一連の処理をクラス化しました。コピペでそのまま利用できます。

using System;
using System.Data;
using System.Linq;
using Oracle.DataAccess.Client;

namespace SampleOracle
{

    /// <summary>
    /// OracleDB操作を提供します
    /// </summary>
    public class OracleDatabaseController
    {


        // 接続情報保持
        private OracleConnection _connection;

        // 実行コマンド保持
        OracleCommand _cmd;


        /// <summary>
        /// インスタンス確立のみの場合
        /// このコンストラクタをご利用下さい
        /// </summary>
        public OracleDatabaseController() { }

        /// <summary>
        /// インスタンス確立と同時にDB接続する場合は
        /// このコンストラクタをご利用下さい
        /// </summary>
        /// <param name="userName">ユーザー名</param>
        /// <param name="password">パスワード</param>
        /// <param name="tnsName">tns名</param>
        public OracleDatabaseController(string userName, string password, string tnsName)
        {

            try
            {
                this.Connect(userName, password, tnsName);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }

        }


        /// <summary>
        /// OracleDBに接続します
        /// </summary>
        /// <param name="userName">ユーザー名</param>
        /// <param name="password">パスワード</param>
        /// <param name="tnsName">tns名</param>
        public void Connect(string userName, string password, string tnsName)
        {

            try
            {
                this._connection = new OracleConnection
                    ("User Id=" + userName + "; "
                    + "Password=" + password + "; "
                    + "Data Source=" + tnsName);
                this._connection.Open();
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }

        /// <summary>
        /// 検索結果を返します
        /// </summary>
        /// <param name="query">select文</param>
        /// <returns>検索結果</returns>
        public DataTable Reader(string query, object[] argument)
        {

            try
            {
                this._cmd = new OracleCommand(query, this._connection);
                this.SetParameter(argument);
                this._cmd.CommandType = CommandType.Text;
                OracleDataAdapter oAdpt = new OracleDataAdapter(this._cmd);
                DataTable dt = new DataTable();
                oAdpt.Fill(dt);
                return dt;
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
            finally
            {
                //OracleDBとの接続を切断します
                this._connection.Close();
            }
        }

        /// <summary>
        /// パラメータをセットします
        /// </summary>
        /// <param name="argument">パラメータ配列</param>
        /// <exception cref="ArgumentException">引数の型が特定できない場合</exception>
        private void SetParameter(object[] argument)
        {

            if (this._cmd != null)
                this._cmd.Parameters.Clear();
            if (argument == null) return;

            foreach (object arg in argument)
            {
                object[] argList = arg.ToString().Split(',');
                OracleParameter parameter = this._cmd.CreateParameter();
                if (argList == null)
                {
                    parameter.Value = (null);
                }
                else
                {
                    parameter.ParameterName = argList[0].ToString();
                    try
                    {
                        parameter.DbType = this.GetDbType(argList[1]);
                    }
                    catch (ArgumentException ex)
                    {
                        throw ex;
                    }
                    parameter.Value = argList[1];
                }
                this._cmd.Parameters.Add(parameter);

            }
            this._cmd.Prepare();

        }

        /// <summary>
        /// パラメータの型を判定します
        /// </summary>
        /// <param name="arg">パラメータ</param>
        /// <returns>パラメータタイプ</returns>
        /// <exception cref="ArgumentException">引数の型が特定できない場合</exception>
        private DbType GetDbType(object arg)
        {

            if (arg is int) return DbType.Int32;
            else if (arg is float || arg is double) return DbType.Double;
            else if (arg is string) return DbType.String;
            else if (arg is DateTime) return DbType.DateTime;
            else if (arg is bool) return DbType.Boolean;
            else throw new ArgumentException("渡された引数の型が処理できない形式です。");

        }
    }
}

 

SELECT用のクラス

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SampleSelect
{
    class Query
    {
        /// <summary>
        /// select文
        /// </summary>
        public string select1()
        {
            return "select \n" +
                    "	COLUMN1 \n" +
                    "from \n" +
                    "	TABLE \n" +
                    "where \n" +
                    "	SALES_DATE between :s and :e \n";
        }
	}
}

OracleDatabaseControllerクラスを使う前提条件

オラクルクライアント

オラクルクライアントがPCにインストールされていること
※私は、オラクル11gを利用しています。

参照設定にdll追加

参照設定にOracle.DataAccess.dllが追加されていること
※私のPCは、「C:\oracle\product\11.2.0\client_1\odp.net\bin\2.x」にOracle.DataAccessがあります。

QueryクラスのSELECT文

データの抽出期間を設定するときは、バインド変数を利用しています。
※where句にある:sと:eがバインド変数です

OracleDatabaseControllerクラスの使い方

オラクル接続/データ抽出/オラクル切断までの流れは、下記の通りです。

インスタンス

private OracleDatabaseController odbc;
private Query Query = new Query();

オラクル接続(接続情報は定数)

odbc = new OracleDatabaseController(SCHEMA.USER_NAME, SCHEMA.PASSWORD, SCHEMA.TNS);

バインド変数(期間)の設定

string from = DateTime.Today.AddDays(-5).ToString("yyyyMMdd");//5日前
string to = DateTime.Today.AddDays(0).ToString("yyyyMMdd");//今日
object[] date = { "s," + from, "e," + to };

データ抽出・切断

DataTable dt = odbc.Reader(Query.select1(), date);

 

初めての方にとっては、このサンプルコードを見ると心が折れそうになるかもしれませんが、接続から切断までの流れをデバッグで追えば非常にシンプルなので是非トライしてみてください。

データベース連携ができるようになれば、集計作業の幅もグッと広がるはずです。

SNSでもご購読できます。

コメント

  1. L より:

    参考にさせて頂きました、ありがとうございます

コメントを残す