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.
 
 
 
 
 

332 lines
16 KiB

using Dapper;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using System.Xml;
namespace Mirle.Component.Database
{
/// <summary>
/// 資料庫擴充方法類別
/// </summary>
public static class RelationDatabaseExtensions
{
/// <summary>
/// 取得資料庫語法
/// </summary>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整子節點名稱</param>
/// <returns>資料庫語法</returns>
private static 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>
private static string GetScriptContent(string filePath, string fileName, string nodeName)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load($"{filePath}\\{fileName}");
return xmlDocument.SelectSingleNode(nodeName).InnerText.Trim();
}
#region === [Read] ===
/// <summary>
/// 查詢資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">資料庫語法</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<dynamic> GetData(this IDbConnection conn, string query,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
return conn.Query(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<dynamic> GetData(this IDbConnection conn, string filePath, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, nodeName);
return conn.Query(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<dynamic> GetData(this IDbConnection conn, string filePath, string fileName, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, fileName, nodeName);
return conn.Query(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">關聯式資料庫語法</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<T> GetData<T>(this IDbConnection conn, string query,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
return conn.Query<T>(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<T> GetData<T>(this IDbConnection conn, string filePath, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, nodeName);
return conn.Query<T>(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static IEnumerable<T> GetData<T>(this IDbConnection conn, string filePath, string fileName, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, fileName, nodeName);
return conn.Query<T>(query, param, trans, true, commandTimeOut, CommandType.Text);
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">關聯式資料庫語法</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<dynamic>> GetDataAsync(this IDbConnection conn, string query,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
IEnumerable<dynamic> dataset = await conn.QueryAsync(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<dynamic>> GetDataAsync(this IDbConnection conn, string filePath, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, nodeName);
IEnumerable<dynamic> dataset = await conn.QueryAsync(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<dynamic>> GetDataAsync(this IDbConnection conn, string filePath, string fileName, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, fileName, nodeName);
IEnumerable<dynamic> dataset = await conn.QueryAsync(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">資料庫語法</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<T>> GetDataAsync<T>(this IDbConnection conn, string query,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
IEnumerable<T> dataset = await conn.QueryAsync<T>(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<T>> GetDataAsync<T>(this IDbConnection conn, string filePath, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, nodeName);
IEnumerable<T> dataset = await conn.QueryAsync<T>(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
/// <summary>
/// 查詢資料表
/// </summary>
/// <typeparam name="T">資料表類別</typeparam>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="commandTimeOut">查詢逾時</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>資料集</returns>
public static async Task<IEnumerable<T>> GetDataAsync<T>(this IDbConnection conn, string filePath, string fileName, string nodeName,
object param = null, IDbTransaction trans = null, int commandTimeOut = 300)
{
string query = GetScriptContent(filePath, fileName, nodeName);
IEnumerable<T> dataset = await conn.QueryAsync<T>(query, param, trans, commandTimeOut, CommandType.Text);
return dataset;
}
#endregion
#region === [Create & Update & Delete] ===
/// <summary>
/// 更新資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">資料庫語法</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>異動筆數</returns>
public static int UpdateData(this IDbConnection conn, string query, object param = null, IDbTransaction trans = null)
{
return conn.Execute(query, param, trans);
}
/// <summary>
/// 更新資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>異動筆數</returns>
public static int UpdateData(this IDbConnection conn, string filePath, string nodeName, object param = null, IDbTransaction trans = null)
{
string query = GetScriptContent(filePath, nodeName);
return conn.Execute(query, param, trans);
}
/// <summary>
/// 更新資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>異動筆數</returns>
public static int UpdateData(this IDbConnection conn, string filePath, string fileName, string nodeName, object param = null, IDbTransaction trans = null)
{
string query = GetScriptContent(filePath, fileName, nodeName);
return conn.Execute(query, param, trans);
}
/// <summary>
/// 更新資料表資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="query">資料庫語法</param>
/// <param name="param">參數</param>
/// <param name="trans">資料庫交易</param>
/// <returns>異動筆數</returns>
public static Task<int> UpdateDataAsync(this IDbConnection conn, string query, object param = null, IDbTransaction trans = null)
{
return conn.ExecuteAsync(query, param, trans);
}
/// <summary>
/// 更新資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">完整檔案路徑</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>異動筆數</returns>
public static Task<int> UpdateDataAsync(this IDbConnection conn, string filePath, string nodeName, object param = null, IDbTransaction trans = null)
{
string query = GetScriptContent(filePath, nodeName);
return conn.ExecuteAsync(query, param, trans);
}
/// <summary>
/// 更新資料
/// </summary>
/// <param name="conn">關聯式資料庫連線</param>
/// <param name="filePath">檔案路徑</param>
/// <param name="fileName">檔案名稱</param>
/// <param name="nodeName">完整節點名稱</param>
/// <param name="param">參數</param>
/// <param name="trans">關聯式資料庫交易</param>
/// <returns>異動筆數</returns>
public static Task<int> UpdateDataAsync(this IDbConnection conn, string filePath, string fileName, string nodeName, object param = null, IDbTransaction trans = null)
{
string query = GetScriptContent(filePath, fileName, nodeName);
return conn.ExecuteAsync(query, param, trans);
}
#endregion
}
}