using Npgsql; using Oracle.ManagedDataAccess.Client; using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Xml; namespace Mirle.Component.Database { /// /// 關聯式資料庫類別 /// public class RelationDatabaseFactory : IDisposable { /// /// 建構式 /// protected RelationDatabaseFactory() { Opne(); } /// /// 建構式 /// /// 資料庫類別 protected RelationDatabaseFactory(RelationDatabaseType databaseType) { _databaseType = databaseType; Opne(); } /// /// 關聯式資料庫物件 /// private static volatile RelationDatabaseFactory _relationDB; /// /// 關聯式資料庫物件鎖定 /// private static readonly object _syncRoot = new object(); /// /// 關聯式資料庫類別 /// private RelationDatabaseType _databaseType = RelationDatabaseType.Oracle; /// /// 關聯式資料庫連線 /// public IDbConnection Connection { get { return Opne(); } } /// /// 關聯式資料庫類別實例 /// /// 資料庫類別 /// 關聯式資料庫類別 /// 預設為 Oracle Database public static RelationDatabaseFactory Instance(RelationDatabaseType databaseType = RelationDatabaseType.Oracle) { if (_relationDB == null) { lock (_syncRoot) // 鎖定避免多執行緒重覆呼叫建立物件 { _relationDB = new RelationDatabaseFactory(databaseType); } } return _relationDB; } /// /// 開啟資料庫連線 /// /// 資料庫連線 /// 資料庫類別未定義 private IDbConnection Opne() { IDbConnection conn; switch (_databaseType) { case RelationDatabaseType.Oracle: { conn = new OracleConnection(ConfigurationManager.ConnectionStrings["Oracle"].ConnectionString); break; } case RelationDatabaseType.Mssql: { conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Mssql"].ConnectionString); break; } case RelationDatabaseType.PostgreSQL: { conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString); break; } default: { throw new ArgumentException("Undefined database or not support."); } } if (conn.State != ConnectionState.Open) conn.Open(); return conn; } /// /// 設定資料庫類別 /// /// 資料庫類別列舉項目 public void SetRelationDatabaseType(RelationDatabaseType relationDatabaseType) { _databaseType = relationDatabaseType; } /// /// 確認交易 /// /// 資料庫交易 /// 交易結果 /// True/False public bool Commit(IDbTransaction trans, out string result) { try { trans.Commit(); result = "Success"; return true; } catch (Exception ex) { trans.Rollback(); result = ex.Message; return false; } finally { trans.Dispose(); } } /// /// 取得資料庫語法 /// /// 完整檔案路徑 /// 完整子節點名稱 /// 資料庫語法 public string GetScriptContent(string filePath, string nodeName) { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(filePath); return xmlDocument.SelectSingleNode(nodeName).InnerText.Trim(); } /// /// 取得資料庫語法 /// /// 檔案路徑 /// 檔案名稱 /// 完整子節點名稱 /// 資料庫語法 public string GetScriptContent(string filePath, string fileName, string nodeName) { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load($"{filePath}\\{fileName}"); return xmlDocument.SelectSingleNode(nodeName).InnerText.Trim(); } #region Destructure /// /// 釋放旗標 /// private bool disposedValue; /// /// 釋放物件 /// public void Dispose() { // 請勿變更此程式碼。請將清除程式碼放入 'Dispose(bool disposing)' 方法 Dispose(disposing: true); GC.SuppressFinalize(this); } /// /// 解構式 /// ~RelationDatabaseFactory() => Dispose(false); // 僅有當 'Dispose(bool disposing)' 具有會釋出非受控資源的程式碼時,才覆寫完成項 /// /// 釋放物件 /// /// 受控物件釋放旗標 protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // 處置受控狀態 (受控物件) } // 釋出非受控資源 (非受控物件) 並覆寫完成項 // 將大型欄位設為 Null disposedValue = true; } } #endregion } /// /// 關聯式資料庫類別 /// public enum RelationDatabaseType { /// /// Oracle Database /// Oracle, /// /// Microsoft SQL Server Database /// Mssql, /// /// PostgreSQL Database /// PostgreSQL } }