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
}
}