汎用DBモジュール - git0331-lgtm/Knowledge GitHub Wiki

### 汎用DBモジュールSQLServer・IBM・Access・ODBC 対応)
/*
 * モジュール名 : 共通モジュール
 * 作成日       : 2024/12 -
 */

// システム
using System;
using System.Data;
using System.Windows.Forms;

// DB関連
using Microsoft.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;

namespace Global
{
    public class GlobalModules
    {
        /// <summary>
        /// エラーメッセージ
        /// </summary>
        public class ErrorMessage
        {
            /// <summary>
            /// 認証方法が無効
            /// </summary>
            
            public const string InvalidAuthenticationMethodMessage = "認証方法が無効です。";

            /// <summary>
            /// 接続方法が無効
            /// </summary>
            
            public const string InvalidConnectionMethodMessage = "接続方法が無効です。";

            /// <summary>
            /// サポートされていない接続タイプ
            /// </summary>
            
            public const string UnsupportedConnectionTypeMessage = "サポートされていない接続タイプです。";

            /// <summary>
            /// DB接続が確立されていない
            /// </summary>
            
            public const string DbConnectionNotEstablishedMessage = "DB接続が確立されていません。";

            /// <summary>
            /// クエリ実行中にエラーが発生
            /// </summary>
            
            public const string QueryExecutionErrorMessage = "クエリ実行中にエラーが発生しました。";

            /// <summary>
            /// 値がnull
            /// </summary>
            
            public const string NullTypeMessage = "値が null です。";
        }


        /// <summary>
        /// 接続パラメータ
        /// </summary>
        public class ConnectionParameters
        {
            /// <summary>
            /// 認証方法
            /// 0 : Windows認証
            /// 1 : SQLServer認証
            /// 2 : Access認証なし
            /// 3 : IBMDA400
            /// 4 : Client_Access ODBC Driver(32bit)
            /// </summary>
            /// 

            public byte AuthenticationMethod { get; set; }

            /// <summary>
            /// 接続方法
            /// 0 : DSNなし
            /// 1 : DSNあり
            /// </summary>

            public byte ConnectionMethod { get; set; }

            /// <summary>
            /// サーバ名またはアドレス (DSNありの場合は空欄)
            /// 例 : SQLSV01
            /// </summary>

            public string Server { get; set; }

            /// <summary>
            /// データベース名またはファイルパス (DSNありの場合は空欄)
            /// 例 : KLCM00
            /// 例 : C:\Program Files\Data\Database.mdb
            /// </summary>

            public string Database { get; set; }

            /// <summary>
            /// データソース名 (DSN) (DSNなしの場合またはAccessの場合は空欄)
            /// 例 : 顧客リスト管理システム
            /// </summary>

            public string Dsn { get; set; }

            /// <summary>
            /// 接続ユーザID (Windows認証またはAccessの場合は空欄)
            /// </summary>

            public string Uid { get; set; }

            /// <summary>
            /// 接続パスワード (Windows認証またはAccessの場合は空欄)
            /// </summary>

            public string Pwd { get; set; }

            /// <summary>
            /// SSL証明書の検証(SQLServer認証以外の場合は空欄)
            /// 検証スキップ : true
            /// 検証実行     : false
            /// </summary>

            public string SSLAuthentication { get; set; }

            /// <summary>
            /// 接続失敗時のメッセージ表示設定
            /// 0 : 接続失敗時、メッセージ表示あり
            /// 1 : 接続失敗時、メッセージ表示なし
            /// </summary>
            
            public byte ShowErrorMessage { get; set; }
        }


        /// <summary>
        /// 接続文字列生成
        /// </summary>
        /// <param name="parameters">接続パラメータ</param>
        /// <returns>接続文字列</returns>
        private string GenerateConnectionString(ConnectionParameters parameters)
        {
            return parameters.ConnectionMethod switch
            {
                // DSNなし
                0 => parameters.AuthenticationMethod switch
                {
                    // Windows認証
                    0 => $"Server={parameters.Server};Database={parameters.Database};Integrated Security=True;",

                    // SQLServer認証
                    1 => $"Server={parameters.Server};Database={parameters.Database};User ID={parameters.Uid};Password={parameters.Pwd};TrustServerCertificate={parameters.SSLAuthentication};",

                    // Access認証なし
                    2 => $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={parameters.Database};",

                    // IBM DA400
                    3 => $"Provider=IBMDA400;Data Source={parameters.Server};User ID={parameters.Uid};Password={parameters.Pwd};Default Collection={parameters.Database};",

                    // Client Access ODBC Driver
                    4 => $"DRIVER=Client Access ODBC Driver (32-bit);DBQ={parameters.Database};SYSTEM={parameters.Server};UID={parameters.Uid};PWD={parameters.Pwd};",

                    // 例外エラー処理
                    _ => throw new ArgumentException(ErrorMessage.InvalidAuthenticationMethodMessage)
                },

                // DSNあり
                1 => $"DSN={parameters.Dsn};UID={parameters.Uid};PWD={parameters.Pwd};",

                // 例外エラー
                _ => throw new ArgumentException(ErrorMessage.InvalidConnectionMethodMessage)
            };
        }


        /// <summary>
        /// DBオブジェクト生成
        /// </summary>
        /// <param name="parameters">接続パラメータ</param>
        /// <returns>DBオブジェクト</returns>
        private IDbConnection CreateDbObj(ConnectionParameters parameters)
        {
            switch (parameters.AuthenticationMethod)
            {
                /*
                 * Windows認証
                 * SQLServer認証
                 */
                case 0:
                case 1:
                    return new SqlConnection();

                /*
                 * Access
                 */
                case 2:
                    return new OleDbConnection();

                /*
                 * IBM DA400
                 * Client Access ODBC Driver
                 */
                case 3:
                case 4:
                    return new OdbcConnection();

                /*
                 * 例外エラー
                 */
                default:
                    throw new ArgumentException(ErrorMessage.InvalidAuthenticationMethodMessage);
            }
        }


        /// <summary>
        /// DB接続(使用メソッド : GenerateConnectionString + CreateDbObj)
        /// </summary>
        /// <param name="parameters">接続パラメータ</param>
        /// <returns>DBオブジェクト または null</returns>
        public IDbConnection OpenDb(ConnectionParameters parameters)
        {
            IDbConnection dbObj = null;

            try
            {
                // 接続文字列生成
                string connectionString = GenerateConnectionString(parameters);

                // DB接続
                dbObj = CreateDbObj(parameters);
                dbObj.ConnectionString = connectionString;
                dbObj.Open();
            }
            catch (Exception ex)
            {
                if (parameters.ShowErrorMessage == 0)
                {
                    MessageBox.Show($"{ex.Message}",
                        "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            if (dbObj != null)
            {
                // オープンしたDBオブジェクト
                return dbObj;
            }
            else
            {
                MessageBox.Show($"{Global.GlobalModules.ErrorMessage.NullTypeMessage}",
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // 呼び出し元でプログラム中断処理を行う
                return null;
            }
        }


        /// <summary>
        /// SELECT文(パラメータなし)
        /// </summary>
        /// <param name="dbObj">DBオブジェクト</param>
        /// <param name="parameters">接続パラメータ</param>
        /// <param name="query">クエリ</param>
        /// <returns>データテーブル</returns>
        public DataTable ExecuteQuery(IDbConnection dbObj, ConnectionParameters parameters, string sqlQuery)
        {
            // DB接続確立を確認
            if (dbObj == null || dbObj.State != ConnectionState.Open)
            {
                MessageBox.Show(Global.GlobalModules.ErrorMessage.DbConnectionNotEstablishedMessage,
                    "エラー",MessageBoxButtons.OK,MessageBoxIcon.Error);

                return null;
            }

            DataTable dataTable = new DataTable();

            try
            {
                using (IDbCommand command = dbObj.CreateCommand())
                {
                    command.CommandText = sqlQuery;

                    using (IDataReader reader = command.ExecuteReader())
                    {
                        dataTable.Load(reader);
                    }
                }
            }
            catch (Exception ex)
            {
                //
                // エラーメッセージ作成(↓出力時の表示)
                //
                
                /*
                 * クエリ実行中にエラーが発生しました。
                 * 
                 * 対象サーバ :
                 * サーバ
                 * 
                 * 対象データベース :
                 * データベース
                 * 
                 * 実行クエリ :
                 * クエリ
                 * 
                 * エラー内容 :
                 * 内容
                 */

                string errorMessage = $"{Global.GlobalModules.ErrorMessage.QueryExecutionErrorMessage}\n\n" +
                                      $"対象サーバー :\n{parameters.Server}\n\n" +
                                      $"対象データベース :\n{parameters.Database}\n\n" +
                                      $"実行クエリ :\n{sqlQuery}\n\n" +
                                      $"エラー内容 :\n{ex.Message}";

                // エラーメッセージ表示
                MessageBox.Show(errorMessage, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // 呼び出し元でプログラム中断処理を行う
                return null ;
            }

            // 取得結果
            return dataTable;
        }


        /// <summary>
        /// SELECT文(パラメータあり)
        /// </summary>
        /// <param name="dbObj">DBオブジェクト</param>
        /// <param name="parameters">接続パラメータ</param>
        /// <param name="query">クエリ</param>
        /// <param name="parametersDict">クエリパラメータ</param>
        /// <returns>データテーブル</returns>
        public DataTable ExecuteQuery(IDbConnection dbObj, ConnectionParameters parameters, string sqlQuery, Dictionary<string, object> parametersDict)
        {
            // DB接続確立を確認
            if (dbObj == null || dbObj.State != ConnectionState.Open)
            {
                MessageBox.Show(Global.GlobalModules.ErrorMessage.DbConnectionNotEstablishedMessage,
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return null;
            }

            DataTable dataTable = new DataTable();

            try
            {
                using (IDbCommand command = dbObj.CreateCommand())
                {
                    command.CommandText = sqlQuery;

                    // パラメータをバインド
                    foreach (var param in parametersDict)
                    {
                        var dbParam = command.CreateParameter();
                        dbParam.ParameterName = param.Key;
                        dbParam.Value = param.Value;
                        command.Parameters.Add(dbParam);
                    }

                    using (IDataReader reader = command.ExecuteReader())
                    {
                        dataTable.Load(reader);
                    }
                }
            }
            catch (Exception ex)
            {
                // エラーメッセージ作成
                string errorMessage = $"{Global.GlobalModules.ErrorMessage.QueryExecutionErrorMessage}\n\n" +
                                      $"対象サーバー :\n{parameters.Server}\n\n" +
                                      $"対象データベース :\n{parameters.Database}\n\n" +
                                      $"実行クエリ :\n{sqlQuery}\n\n" +
                                      $"エラー内容 :\n{ex.Message}";

                // エラーメッセージ表示
                MessageBox.Show(errorMessage, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // 呼び出し元でプログラム中断処理を行う
                return null;
            }

            return dataTable;
        }


        /// <summary>
        /// INSERT・UPDATE・DELETE文(パラメータなし)
        /// </summary>
        /// <param name="dbObj">DBオブジェクト</param>
        /// <param name="parameters">接続パラメータ</param>
        /// <param name="query">クエリ</param>
        /// <returns>実行結果(行数)</returns>
        public int ExecuteNonQuery(IDbConnection dbObj, ConnectionParameters parameters, string sqlQuery)
        {
            int errorCode = -1;

            // DB接続確立を確認
            if (dbObj == null || dbObj.State != ConnectionState.Open)
            {
                MessageBox.Show(Global.GlobalModules.ErrorMessage.DbConnectionNotEstablishedMessage,
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return errorCode;
            }

            try
            {
                using (IDbCommand command = dbObj.CreateCommand())
                {
                    command.CommandText = sqlQuery;

                    // 実行結果(影響を受けた行数)取得
                    int affectedRows = command.ExecuteNonQuery();
                    return affectedRows;
                }
            }
            catch (Exception ex)
            {
                //
                // エラーメッセージ作成(↓出力時の表示)
                //

                /*
                 * クエリ実行中にエラーが発生しました。
                 * 
                 * 対象サーバ :
                 * サーバ
                 * 
                 * 対象データベース :
                 * データベース
                 * 
                 * 実行クエリ :
                 * クエリ
                 * 
                 * エラー内容 :
                 * 内容
                 */

                string errorMessage = $"{Global.GlobalModules.ErrorMessage.QueryExecutionErrorMessage}\n\n" +
                                      $"対象サーバー :\n{parameters.Server}\n\n" +
                                      $"対象データベース :\n{parameters.Database}\n\n" +
                                      $"実行クエリ :\n{sqlQuery}\n\n" +
                                      $"エラー内容 :\n{ex.Message}";

                // エラーメッセージ表示
                MessageBox.Show(errorMessage, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // 呼び出し元でプログラム中断処理を行う
                return errorCode;
            }
        }


        /// <summary>
        /// INSERT・UPDATE・DELETE文(パラメータあり)
        /// </summary>
        /// <param name="dbObj">DBオブジェクト</param>
        /// <param name="parameters">接続パラメータ</param>
        /// <param name="query">クエリ</param>
        /// <param name="parametersDict">クエリパラメータ</param>
        /// <returns>実行結果(行数)</returns>
        public int ExecuteNonQuery(IDbConnection dbObj, ConnectionParameters parameters, string sqlQuery, Dictionary<string, object> parametersDict)
        {
            int errorCode = -1;

            // DB接続確立を確認
            if (dbObj == null || dbObj.State != ConnectionState.Open)
            {
                MessageBox.Show(Global.GlobalModules.ErrorMessage.DbConnectionNotEstablishedMessage,
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return errorCode;
            }

            try
            {
                using (IDbCommand command = dbObj.CreateCommand())
                {
                    command.CommandText = sqlQuery;

                    // パラメータをバインド
                    foreach (var param in parametersDict)
                    {
                        var dbParam = command.CreateParameter();
                        dbParam.ParameterName = param.Key;
                        dbParam.Value = param.Value;
                        command.Parameters.Add(dbParam);
                    }

                    // 実行結果(影響を受けた行数)取得
                    int affectedRows = command.ExecuteNonQuery();
                    return affectedRows;
                }
            }
            catch (Exception ex)
            {
                //
                // エラーメッセージ作成(↓出力時の表示)
                //

                /*
                 * クエリ実行中にエラーが発生しました。
                 * 
                 * 対象サーバ :
                 * サーバ
                 * 
                 * 対象データベース :
                 * データベース
                 * 
                 * 実行クエリ :
                 * クエリ
                 * 
                 * エラー内容 :
                 * 内容
                 */

                string errorMessage = $"{Global.GlobalModules.ErrorMessage.QueryExecutionErrorMessage}\n\n" +
                                      $"対象サーバー :\n{parameters.Server}\n\n" +
                                      $"対象データベース :\n{parameters.Database}\n\n" +
                                      $"実行クエリ :\n{sqlQuery}\n\n" +
                                      $"エラー内容 :\n{ex.Message}";

                // エラーメッセージ表示
                MessageBox.Show(errorMessage, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // 呼び出し元でプログラム中断処理を行う
                return errorCode;
            }
        }
    }
}


/*
 * 使用例
 */
// システム
using System;
using System.Data;

// 標準モジュール
using Global;
using Private;

namespace XXX
{
    public partial class Form1 : Form
    {
        // 標準モジュールオブジェクト
        private GlobalModules globalModulesObj = new GlobalModules();
        private PrivateModules privateModulesObj = new PrivateModules();

        // 接続パラメータ
        private GlobalModules.ConnectionParameters sqlServerConnectionParameters;

        // DBオブジェクト
        private IDbConnection dbObj;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // パラメータ指定
            // フィールド変数に格納
            sqlServerConnectionParameters = new GlobalModules.ConnectionParameters()
            {
                AuthenticationMethod = 1,   // SQLServer認証
                ConnectionMethod = 0,       // DSNなし
                Server = "XXX.XXX.XXX.XXX", // サーバ名
                Database = "XXX",           // データベース名
                Uid = "XXX",                // ユーザーID
                Pwd = "XXX",                // パスワード
                SSLAuthentication = "true", // SSL検証(true : 検証しない)
                ShowErrorMessage = 0        // 接続失敗時、エラーメッセージ表示
            };

            // DBオープン
            // フィールド変数に格納
            dbObj = globalModulesObj.OpenDb(sqlServerConnectionParameters);
            if (dbObj == null) return;

            /* デバック用
            string query = $"select * from XXX;";
            var dataTable = globalModulesObj.ExecuteQuery(dbObj, sqlServerConnectionParameters, query);
            if (dataTable == null) return;
            */
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️