Utils/DBAccess.cs

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;

namespace ChatworkBulkSender.Utils
{
    class DBAccess
    {
        public string connection_str;

        public DBAccess()
        {
            var builder = new SqlConnectionStringBuilder();
#if DEBUG
            builder.DataSource = ConfigurationManager.AppSettings["TestDataSource"];
            builder.UserID = "enji_cw_kuzuya";
            builder.Password = "kuzuya00";
            builder.InitialCatalog = ConfigurationManager.AppSettings["TestInitialCatalog"];
            builder.ConnectTimeout = int.Parse(ConfigurationManager.AppSettings["TestTimeOut"]);
#else
            builder.DataSource = ConfigurationManager.AppSettings["DataSource"];
            builder.UserID     = "enji_user";
            builder.Password   = "YenGp@ssW0rd1001";
            builder.InitialCatalog = ConfigurationManager.AppSettings["InitialCatalog"];
            builder.ConnectTimeout = int.Parse(ConfigurationManager.AppSettings["TimeOut"]);
#endif
            connection_str = builder.ConnectionString;
        }

        /// <summary>
        /// SELECT クエリを実行
        /// </summary>
        public DataTable ExecQuery(string sql, Dictionary<string, object> parameters = null)
        {
            try
            {
                var dt = new DataTable();
                using (var con = new SqlConnection(connection_str))
                using (var cmd = new SqlCommand(sql, con))
                {
                    if (parameters != null)
                    {
                        foreach (var kv in parameters)
                            cmd.Parameters.AddWithValue(kv.Key, kv.Value ?? DBNull.Value);
                    }

                    using (var adapter = new SqlDataAdapter(cmd))
                    {
                        adapter.Fill(dt);
                    }
                }
                return dt;
            }
            catch (Exception e)
            {
                const string SERVER_NOT_FOUND = "サーバーが見つからないかアクセスできません";
                if (e.Message.Contains(SERVER_NOT_FOUND))
                {
                    MessageBoxUtil.ShowErr(
                        SERVER_NOT_FOUND + "\r\nPCがネットワークに接続されているか確認してください。\r\n\r\n" + e.Message,
                        "DBエラー");
                    return new DataTable();
                }
                MessageBoxUtil.ShowErr(e.Message, "DBエラー");
                return new DataTable();
            }
        }

        /// <summary>
        /// INSERT/UPDATE/DELETE を実行
        /// </summary>
        public int ExecNonQuery(string sql, Dictionary<string, object> parameters = null)
        {
            return ExecNonQuery(new[] { (sql, parameters) });
        }

        /// <summary>
        /// 複数の DML をトランザクションで実行
        /// </summary>
        public int ExecNonQuery(IEnumerable<(string Sql, Dictionary<string, object> Parameters)> commands)
        {
            int affected = 0;
            using (var con = new SqlConnection(connection_str))
            {
                con.Open();
                using (var tx = con.BeginTransaction())
                using (var cmd = new SqlCommand() { Connection = con, Transaction = tx })
                {
                    try
                    {
                        foreach (var (sql, parameters) in commands)
                        {
                            if (string.IsNullOrWhiteSpace(sql)) continue;
                            cmd.CommandText = sql;
                            cmd.Parameters.Clear();
                            if (parameters != null)
                            {
                                foreach (var kv in parameters)
                                    cmd.Parameters.AddWithValue(kv.Key, kv.Value ?? DBNull.Value);
                            }
                            affected += cmd.ExecuteNonQuery();
                        }
                        tx.Commit();
                    }
                    catch
                    {
                        tx.Rollback();
                        throw;
                    }
                }
            }
            return affected;
        }

        public object ExecuteScalar(string sql, Dictionary<string,object> parameters = null)
        {
            try
            {
                using (var con = new SqlConnection(connection_str))
                using (var cmd = new SqlCommand(sql,con))
                {
                    if (parameters != null)
                    {
                        foreach (var ky in parameters)
                        {
                            cmd.Parameters.AddWithValue(ky.Key, ky.Value ?? DBNull.Value);
                        }
                    }

                    con.Open();
                    return cmd.ExecuteScalar();
                }
                
            }
            catch(Exception e)
            {
                const string SERVER_NOT_FOUND = "サーバーが見つからないかアクセスできません";
                if (e.Message.Contains(SERVER_NOT_FOUND))
                {
                    MessageBoxUtil.ShowErr(
                        SERVER_NOT_FOUND + "\r\nPCがネットワークに接続されているか確認してください。\r\n\r\n" + e.Message,
                        "DBエラー");
                    return null;
                }
                MessageBoxUtil.ShowErr(e.Message, "DBエラー");
                return null;
            }
        }
    }
}