You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
7.1 KiB
222 lines
7.1 KiB
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
|
|
{
|
|
/// <summary>
|
|
/// 關聯式資料庫類別
|
|
/// </summary>
|
|
public class RelationDatabaseFactory : IDisposable
|
|
{
|
|
/// <summary>
|
|
/// 建構式
|
|
/// </summary>
|
|
protected RelationDatabaseFactory()
|
|
{
|
|
Opne();
|
|
}
|
|
/// <summary>
|
|
/// 建構式
|
|
/// </summary>
|
|
/// <param name="databaseType">資料庫類別</param>
|
|
protected RelationDatabaseFactory(RelationDatabaseType databaseType)
|
|
{
|
|
_databaseType = databaseType;
|
|
Opne();
|
|
}
|
|
/// <summary>
|
|
/// 關聯式資料庫物件
|
|
/// </summary>
|
|
private static volatile RelationDatabaseFactory _relationDB;
|
|
/// <summary>
|
|
/// 關聯式資料庫物件鎖定
|
|
/// </summary>
|
|
private static readonly object _syncRoot = new object();
|
|
/// <summary>
|
|
/// 關聯式資料庫類別
|
|
/// </summary>
|
|
private RelationDatabaseType _databaseType = RelationDatabaseType.Oracle;
|
|
/// <summary>
|
|
/// 關聯式資料庫連線
|
|
/// </summary>
|
|
public IDbConnection Connection
|
|
{
|
|
get
|
|
{
|
|
return Opne();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 關聯式資料庫類別實例
|
|
/// </summary>
|
|
/// <param name="databaseType">資料庫類別</param>
|
|
/// <returns>關聯式資料庫類別</returns>
|
|
/// <remarks>預設為 Oracle Database</remarks>
|
|
public static RelationDatabaseFactory Instance(RelationDatabaseType databaseType = RelationDatabaseType.Oracle)
|
|
{
|
|
if (_relationDB == null)
|
|
{
|
|
lock (_syncRoot) // 鎖定避免多執行緒重覆呼叫建立物件
|
|
{
|
|
_relationDB = new RelationDatabaseFactory(databaseType);
|
|
}
|
|
}
|
|
return _relationDB;
|
|
}
|
|
/// <summary>
|
|
/// 開啟資料庫連線
|
|
/// </summary>
|
|
/// <returns>資料庫連線</returns>
|
|
/// <exception cref="ArgumentException">資料庫類別未定義</exception>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// 設定資料庫類別
|
|
/// </summary>
|
|
/// <param name="relationDatabaseType">資料庫類別列舉項目</param>
|
|
public void SetRelationDatabaseType(RelationDatabaseType relationDatabaseType)
|
|
{
|
|
_databaseType = relationDatabaseType;
|
|
}
|
|
/// <summary>
|
|
/// 確認交易
|
|
/// </summary>
|
|
/// <param name="trans">資料庫交易</param>
|
|
/// <param name="result">交易結果</param>
|
|
/// <returns>True/False</returns>
|
|
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();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 取得資料庫語法
|
|
/// </summary>
|
|
/// <param name="filePath">完整檔案路徑</param>
|
|
/// <param name="nodeName">完整子節點名稱</param>
|
|
/// <returns>資料庫語法</returns>
|
|
public string GetScriptContent(string filePath, string nodeName)
|
|
{
|
|
XmlDocument xmlDocument = new XmlDocument();
|
|
xmlDocument.Load(filePath);
|
|
return xmlDocument.SelectSingleNode(nodeName).InnerText.Trim();
|
|
}
|
|
/// <summary>
|
|
/// 取得資料庫語法
|
|
/// </summary>
|
|
/// <param name="filePath">檔案路徑</param>
|
|
/// <param name="fileName">檔案名稱</param>
|
|
/// <param name="nodeName">完整子節點名稱</param>
|
|
/// <returns>資料庫語法</returns>
|
|
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
|
|
|
|
/// <summary>
|
|
/// 釋放旗標
|
|
/// </summary>
|
|
private bool disposedValue;
|
|
/// <summary>
|
|
/// 釋放物件
|
|
/// </summary>
|
|
public void Dispose()
|
|
{
|
|
// 請勿變更此程式碼。請將清除程式碼放入 'Dispose(bool disposing)' 方法
|
|
Dispose(disposing: true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
/// <summary>
|
|
/// 解構式
|
|
/// </summary>
|
|
~RelationDatabaseFactory() => Dispose(false); // 僅有當 'Dispose(bool disposing)' 具有會釋出非受控資源的程式碼時,才覆寫完成項
|
|
/// <summary>
|
|
/// 釋放物件
|
|
/// </summary>
|
|
/// <param name="disposing">受控物件釋放旗標</param>
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (!disposedValue)
|
|
{
|
|
if (disposing)
|
|
{
|
|
// 處置受控狀態 (受控物件)
|
|
}
|
|
// 釋出非受控資源 (非受控物件) 並覆寫完成項
|
|
// 將大型欄位設為 Null
|
|
disposedValue = true;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
/// <summary>
|
|
/// 關聯式資料庫類別
|
|
/// </summary>
|
|
public enum RelationDatabaseType
|
|
{
|
|
/// <summary>
|
|
/// Oracle Database
|
|
/// </summary>
|
|
Oracle,
|
|
/// <summary>
|
|
/// Microsoft SQL Server Database
|
|
/// </summary>
|
|
Mssql,
|
|
/// <summary>
|
|
/// PostgreSQL Database
|
|
/// </summary>
|
|
PostgreSQL
|
|
}
|
|
}
|