### 汎用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;
*/
}
}
}