DbHelperクラス

DbAccess

C#のDB処理のヘルパークラス。

SQL Server 2016の教科書 開発編

SQL Server 2016の教科書 開発編

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Text;
using System.Text.RegularExpressions;
using System.Configuration;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace MyApp.Common.Db
{
    /// <summary>
    /// DBクラス
    /// </summary>
    public class DbAccess : IDisposable
    {
        #region 変数・プロパティ

        /// <summary>
        /// コネクション
        /// </summary>
        private SqlConnection connection = null;

        /// <summary>
        /// トランザクション
        /// </summary>
        private SqlTransaction transaction = null;

        /// <summary>
        /// リスース開放フラグ
        /// </summary>
        private bool disposedFlag = false;

        #endregion

        #region コンストラクタ
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DbAccess()
        {
            // TODO 接続文字列取得先変更済み
            // string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            string constr = RoleEnvironment.GetConfigurationSettingValue("ServiceDBConnectStr");
            this.connection = new SqlConnection(constr);
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="connectionString">接続文字列</param>
        public DbAccess(string connectionString)
        {
            this.connection = new SqlConnection(connectionString);
        }
        #endregion

        #region リソースを開放
        /// <summary>
        /// リソースを解放します。
        /// </summary>
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// リソースを開放
        /// </summary>
        public void Dispose(bool disposing)
        {
            if (this.disposedFlag == false)
            {
                if (disposing)
                {
                    if (this.transaction != null)
                    {
                        this.transaction.Dispose();
                    }

                    if (this.connection != null)
                    {
                        this.Close();
                        this.connection.Dispose();
                    }
                }
                this.disposedFlag = true;
            }
        }
        #endregion

        #region データベース接続を開く
        /// <summary>
        /// データベース接続を開く
        /// </summary>
        public void Open()
        {
            try
            {
                this.connection.Open();
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region データベースへの接続を閉じる
        /// <summary>
        /// データベースへの接続を閉じる
        /// </summary>
        public void Close()
        {
            try
            {
                if (this.connection != null &&
                    this.connection.State == ConnectionState.Open)
                {
                    this.connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region トランザクションを開始
        /// <summary>
        /// トランザクションを開始
        /// </summary>
        public SqlTransaction BeginTransaction()
        {
            try
            {
                this.transaction = this.connection.BeginTransaction(IsolationLevel.RepeatableRead);
            }
            catch (Exception)
            {
                throw;
            }

            return this.transaction;
        }

        /// <summary>
        /// トランザクションを開始
        /// </summary>
        public SqlTransaction BeginTransaction(IsolationLevel isolationLevel)
        {
            try
            {
                this.transaction = this.connection.BeginTransaction(isolationLevel);
            }
            catch (Exception)
            {
                throw;
            }

            return this.transaction;
        }
        #endregion

        #region トランザクション処理をコミット
        /// <summary>
        /// トランザクション処理をコミット
        /// </summary>
        public void Commit()
        {
            try
            {
                if (this.transaction != null)
                {
                    this.transaction.Commit();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region トランザクション処理をロールバック
        /// <summary>
        /// トランザクション処理をロールバック
        /// </summary>
        public void Rollback()
        {
            try
            {
                if (this.transaction != null)
                {
                    this.transaction.Rollback();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region 参照系SQLを実行
        /// <summary>
        /// 参照系SQLを実行
        /// </summary>
        /// <param name="cmd">コマンド</param>
        /// <returns>データを取得した場合は参照結果データテーブル。取得できない場合はNULL。</returns>
        public DataTable ExecuteQuery(SqlCommand cmd)
        {
            DataTable retDt = null;

            try
            {
                cmd.Connection = this.connection;
                if (this.transaction != null)
                {
                    cmd.Transaction = this.transaction;
                }

                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
                retDt = new DataTable();
                adapter.Fill(retDt);
            }
            catch (Exception)
            {
                retDt = null;
                throw;
            }

            return retDt;
        }
        #endregion

        #region 更新系SQLを実行
        /// <summary>
        /// 更新系SQLを実行
        /// </summary>
        /// <param name="command">コマンド</param>
        /// <returns>影響を受けた行数</returns>
        public int ExecNonQuery(SqlCommand cmd)
        {
            int retCount = 0;

            try
            {
                cmd.Connection = this.connection;

                if (this.transaction != null)
                {
                    cmd.Transaction = this.transaction;
                }

                retCount = cmd.ExecuteNonQuery();
            }
            catch (Exception)
            {
                throw;
            }

            return retCount;
        }
        #endregion

        #region クエリを実行し、そのクエリが返す結果セットの最初の行にある最初の列を返します。
        /// <summary>
        /// クエリを実行し、そのクエリが返す結果セットの最初の行にある最初の列を返します。
        /// </summary>
        /// <param name="cmd"></param>
        /// <returns> 結果セットの最初の行の最初の列。結果セットが空の場合はnull。</returns>
        public T ExecuteScalar<T>(SqlCommand cmd)
        {
            cmd.Connection = this.connection;

            try
            {
                if (this.transaction != null)
                {
                    cmd.Transaction = this.transaction;
                }

                return (T)(cmd.ExecuteScalar());
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region Like用エスケープ処理
        /// <summary>
        /// Like用エスケープ処理
        /// </summary>
        /// <param name="text">対象文字列</param>
        /// <returns>エスケープ結果</returns>
        public static string LikeEscapeString(string text)
        {
            return Regex.Replace(text, @"[%_\[]", "[$0]");
        }
        #endregion

        #region 文字列を指定した型へ変換
        /// <summary>
        /// 文字列を指定した型へ変換
        /// </summary>
        /// <param name="data">対象データ</param>
        /// <returns>変換結果</returns>
        public static T ConvertValue<T>(string data)
        {
            object obj = null;

            if (typeof(int) == typeof(T))
            {
                if (string.IsNullOrEmpty(data))
                {
                    obj = 0;
                }
                else
                {
                    obj = int.Parse(data);
                }
            }
            else if (typeof(string) == typeof(T))
            {
                if (string.IsNullOrEmpty(data))
                {
                    obj = string.Empty;
                }
                else
                {
                    obj = data.ToString();
                }
            }
            else
            {
                throw new ArgumentException("type error.");
            }

            return (T)obj;
        }

        #endregion

        #region SQLパラメータ作成
        /// <summary>
        /// SQLパラメータ作成
        /// </summary>
        /// <param name="cmd">SqlCmdオブジェクト</param>
        /// <param name="parameterName">パラメータ名</param>
        /// <param name="type">SqlDbType</param>
        /// <param name="value"></param>
        public static void AddSqlParameter(SqlCommand cmd, string parameterName, SqlDbType type, Object value)
        {
            SqlParameter param = cmd.CreateParameter();
            param.ParameterName = parameterName;
            param.SqlDbType = type;
            param.Direction = ParameterDirection.Input;
            param.Value = value;
            cmd.Parameters.Add(param);
        }
	    #endregion

    }
}