2020年4月
      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    

最近のコメント

最近のトラックバック

無料ブログはココログ

« 仕事論 「水曜どうでしょう」2人の名物ディレクターが働き方を語る 藤村忠寿、嬉野雅道著を読んだ感想・書評 | トップページ | みずほ銀行システム統合、苦闘の19年史 史上最大のITプロジェクト「3度目の正直」 の感想 »

2020年3月 8日 (日)

ODP.NET Managed Driverを用いた、Oracle接続用クラスのサンプル(C#)

.Net Framework4以降のバージョンで、オラクルに接続するためのドライバで、Oracleクライアント不要のドライバ ODP.NET Managed Driverが提供されています。

Oracleクライアントがらみで、度々面倒なことが起きたので、プログラムを書き直そうという話になり、元になるサンプルプログラムを書いたので、参考に載せておきます。


using System.Data;
using System.Configuration;
using Oracle.ManagedDataAccess.Client;

namespace CommonClass.DbAccess
{
    #region データベースに対する問い合わせを実行するクラス
    /// 
    /// データベースに対する問い合わせを実行するクラス
    /// 
    public class ExecuteDb
    {
        protected bool _isBeginTrans = false; //接続中 true、切断中 false

        #region プロパティ OracleConnection

        private OracleConnection _cnnDb;

        /// 
        /// プロパティ OracleConnection
        /// 
        public OracleConnection CnnDb
        {
            get { return this._cnnDb; }
            set { this._cnnDb = CnnDb; }

        }
        #endregion

        #region プロパティ OracleTransaction
        private OracleTransaction _tran;

        /// 
        /// Oracle トランザクション
        /// 
        public OracleTransaction Tran
        {
            get { return this._tran; }

            set { this._tran = Tran; }
        }
        #endregion

        #region コンストラクタ
        /// 
        /// コンストラクタ
        /// 
        public ExecuteDb()
        {
            this._cnnDb = new OracleConnection(GetOracleConnectionString());
        }

        /// 
        /// コンストラクタ
        /// 
        /// Oracle Connection
        public ExecuteDb(OracleConnection cnnDb)
        {
            this._cnnDb = cnnDb;
        }
        #endregion


        #region デストラクタ
        /// 
        /// デストラクタ
        /// 
        ~ExecuteDb()
        {

            if(!this._isBeginTrans)
            {
                ///openしていたら、closeする
                if (this._cnnDb.State == ConnectionState.Open)
                {
                    this._cnnDb.Close();
                }
            }

            
        }
        #endregion

        #region GetOracleConnectionString/Configから接続文字列を取得
        public static string GetOracleConnectionString()
        {
            return ConfigurationManager.AppSettings["OracleConString"].ToString();
        }
        #endregion


        #region  BeginTrans トランザクションを開始する
        /// 
        /// トランザクションを開始する
        /// 
        public void BeginTrans()
        {
            if(! this._isBeginTrans)
            {
                //切断していたら再接続
                if(this._cnnDb.State == ConnectionState.Closed)
                {
                    this._cnnDb.Open();
                }
            }

            //前回のトランザクションを破棄
            if(this._tran != null)
            {
                try
                {
                    this._tran.Rollback();
                }
                catch (Exception ex)
                {
                    this._tran.Rollback();
                }
            }

            this._tran = this._cnnDb.BeginTransaction();
            this._isBeginTrans = true;
        }
        #endregion

        #region Commit/コミットを実行する、切断する
        /// 
        /// コミットを実行する、切断する
        /// 
        public void Commit()
        {
            if(this._isBeginTrans)
            {
                this._tran.Commit();

                this._tran.Dispose();

                if(this._cnnDb.State == ConnectionState.Open)
                {
                    this._cnnDb.Close();
                }

                this._isBeginTrans = false;
            }
        }
        #endregion


        #region Rollback/ロールバックを実行して、切断する
        /// 
        /// ロールバックを実行して、切断する
        /// 
        public void Rollback()
        {
            if (this._isBeginTrans)
            {
                this._tran.Rollback();

                this._tran.Dispose();

                if (this._cnnDb.State == ConnectionState.Open)
                {
                    this._cnnDb.Close();
                }

                this._isBeginTrans = false;
            }
        }
        #endregion

        #region RunSql/クエリ以外の処理実行
        /// 
        /// クエリ以外の処理実行
        /// 
        /// OracleCommand
        /// 処理件数
        public int RunSql(OracleCommand cmd)
        {
            try
            {
                int result = 0;

                cmd.Connection = this._cnnDb;

                //トランザクションが開始されていたら、開始する
                if (this._isBeginTrans)
                {
                    cmd.Transaction = this._tran;
                }

                result = cmd.ExecuteNonQuery();

                return result;
            }
            catch (OracleException ex)
            {
                throw new Exception(ex.Message);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if(! this._isBeginTrans)
                {
                    if(cmd.Connection.State == ConnectionState.Open)
                    {
                        cmd.Connection.Close();
                    }
                }

            }

            
        }
        #endregion

        #region RunSelect/クエリを実行する
        /// 
        /// クエリを実行する
        /// 
        /// OracleCommand
        /// DataTable
        public DataTable RunSelect(OracleCommand cmd)
        {
            DataTable dt = new DataTable();

            try
            {
                cmd.Connection = this._cnnDb;

                //トランザクションが開始されていたら、開始する
                if (this._isBeginTrans)
                {
                    cmd.Transaction = this._tran;
                }

                if(_isBeginTrans)
                {
                    //トランザクション中の場合
                    cmd.Transaction = this._tran;
                }
                    
                using (OracleDataAdapter da = new OracleDataAdapter(cmd))
                {
                    da.Fill(dt);
                }
                return dt;
            }
            catch(OracleException ex)
            {
                throw new Exception(ex.Message);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
}
#endregion


« 仕事論 「水曜どうでしょう」2人の名物ディレクターが働き方を語る 藤村忠寿、嬉野雅道著を読んだ感想・書評 | トップページ | みずほ銀行システム統合、苦闘の19年史 史上最大のITプロジェクト「3度目の正直」 の感想 »

システム開発」カテゴリの記事