データベース操作を管理するクラスを作成してみる（C#, SQLServer）

データベース操作系の処理を一つのクラスにまとめてみます。
DB処理の基本的な内容となります。

#サンプルコード

##データベース操作を管理するクラス(DBManager.cs)

```C#:DBManager.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp01
{
    /// <summary>
    /// データベース操作を管理するクラス
    /// </summary>
    class DBManager
    {
        private SqlConnection sqlConnection;
        private SqlTransaction sqlTransaction;

        /// <summary>
        /// コンストラクタ（DB接続）
        /// <para name="dbServer">DBサーバ名</para>
        /// <para name="dbName">DB名</para>
        /// <para name="dbUser">ユーザ名</para>
        /// <para name="dbPass">パスワード</para>
        /// </summary>
        public DBManager(string dbServer, string dbName, string dbUser, string dbPass)
        {
            // 接続文字列を生成
            string connectString =
            "Data Source = " + dbServer
            + ";Initial Catalog = " + dbName
            + ";User ID = " + dbUser
            + ";Password = " + dbPass
            + ";MultipleActiveResultSets=True";

            // SqlConnection の新しいインスタンスを生成 (接続文字列を指定)
            this.sqlConnection = new SqlConnection(connectString);

            // データベース接続を開く
            this.sqlConnection.Open();
        }

        /// <summary>
        /// DB切断
        /// </summary>
        public void Close()
        {
            this.sqlConnection.Close();
            this.sqlConnection.Dispose();
        }

        /// <summary>
        /// トランザクション開始
        /// </summary>
        public void BeginTran()
        {
            this.sqlTransaction = this.sqlConnection.BeginTransaction();
        }

        /// <summary>
        /// トランザクション　コミット
        /// </summary>
        public void CommitTran()
        {
            if (this.sqlTransaction.Connection != null)
            {
                this.sqlTransaction.Commit();
                this.sqlTransaction.Dispose();
            }
        }

        /// <summary>
        /// トランザクション　ロールバック
        /// </summary>
        public void RollBack()
        {
            if (this.sqlTransaction.Connection != null)
            {
                this.sqlTransaction.Rollback();
                this.sqlTransaction.Dispose();
            }
        }

        /// <summary>
        /// クエリー実行(OUTPUT項目あり)
        /// <para name="query">SQL文</para>
        /// <para name="paramDict">SQLパラメータ</para>
        /// </summary>
        public SqlDataReader ExecuteQuery(string query, Dictionary<string, Object> paramDict)
        {
            SqlCommand sqlCom = new SqlCommand();

            //クエリー送信先、トランザクションの指定
            sqlCom.Connection = this.sqlConnection;
            sqlCom.Transaction = this.sqlTransaction;

            sqlCom.CommandText = query;
            foreach (KeyValuePair<string, Object> item in paramDict)
            {
                sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value));
            }

            // SQLを実行
            SqlDataReader reader = sqlCom.ExecuteReader();

            return reader;
        }

        /// <summary>
        /// クエリー実行(OUTPUT項目あり)
        /// <para name="query">SQL文</para>
        /// </summary>
        public SqlDataReader ExecuteQuery(string query)
        {
            return this.ExecuteQuery(query, new Dictionary<string, Object>());
        }

        /// <summary>
        /// クエリー実行(OUTPUT項目なし)
        /// <para name="query">SQL文</para>
        /// <para name="paramDict">SQLパラメータ</para>
        /// </summary>
        public void ExecuteNonQuery(string query, Dictionary<string, Object> paramDict)
        {
            SqlCommand sqlCom = new SqlCommand();

            //クエリー送信先、トランザクションの指定
            sqlCom.Connection = this.sqlConnection;
            sqlCom.Transaction = this.sqlTransaction;

            sqlCom.CommandText = query;
            foreach(KeyValuePair<string, Object> item in paramDict) {
                sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value));
            }

            // SQLを実行
            sqlCom.ExecuteNonQuery();
        }
    }
}

```

##使用例（SELECT編）

```C#:sample1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp01
{
    /// <summary>
    /// 使用例（SELECT編）
    /// </summary>
    class Program
    {
        //データベース接続情報
        private const string DATABASE_SERVER = "hogehoge";
        private const string DATABASE_NAME = "honyararaDB";
        private const string DATABASE_USER = "sa";
        private const string DATABASE_PASSWORD = "naishowords";

        /// <summary>
        /// Mainメソッド
        /// </summary>
        public static void Main(string[] args)
        {
            DBManager dbmanager = new DBManager(DATABASE_SERVER, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD);
            try
            {
                dbmanager.BeginTran();

                string selectSql = @"SELECT * FROM fugagugaTable ";
                SqlDataReader reader = dbmanager.ExecuteQuery(selectSql);
                int uId_Or = reader.GetOrdinal("uId");
                int uNm_Or = reader.GetOrdinal("uNm");

                while (reader.Read())
                {
                    Decimal uId = reader.GetDecimal(uId_Or);
                    string uNm = reader.GetString(uNm_Or);

                    Console.WriteLine("uId: {0}, uNm: {1}", uId, uNm);
                }
                dbmanager.CommitTran();
            }
            catch (SqlException sqle)
            {
                Console.WriteLine("Number: {0}, Message: {1}", sqle.Number, sqle.Message);
                dbmanager.RollBack();
            }
            finally
            {
                dbmanager.Close();
            }
        }
    }
}
```

##使用例（INSERT編（UPDATE/DELETEも同様））

```C#:sample2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp01
{
    /// <summary>
    /// 使用例（INSERT編（UPDATE/DELETEも同様））
    /// </summary>
    class Program
    {
        //データベース接続情報
        private const string DATABASE_SERVER = "hogehoge";
        private const string DATABASE_NAME = "honyararaDB";
        private const string DATABASE_USER = "sa";
        private const string DATABASE_PASSWORD = "naishowords";

        /// <summary>
        /// Mainメソッド
        /// </summary>
        public static void Main(string[] args)
        {
            DBManager dbmanager = new DBManager(DATABASE_SERVER, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD);
            try
            {
                dbmanager.BeginTran();

                string insertSql = @"INSERT INTO fugagugaTable (COL_A, COL_B, COL_C) VALUES (@COL_A, @COL_B, @COL_C )";
                Dictionary<String, Object> paramDict = new Dictionary<string, Object>();
                paramDict.Add("@COL_A", "値あ");
                paramDict.Add("@COL_B", "値い");
                paramDict.Add("@COL_C", "値う");
                dbmanager.ExecuteNonQuery(insertSql, paramDict);

                dbmanager.CommitTran();
            }
            catch (SqlException sqle)
            {
                Console.WriteLine("Number: {0}, Message: {1}", sqle.Number, sqle.Message);
                dbmanager.RollBack();
            }
            finally
            {
                dbmanager.Close();
            }
        }
    }
}
```

以上です。