using Dapper;
using DapperExtensions;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace DBLibrarys.DBHelper
{
/// <summary>
/// 資料庫操作類
/// </summary>
public class SqlDapperHelper
{
static string connStrRead = ConfigurationManager.ConnectionStrings["Read"].ConnectionString;
static string connStrWrite = ConfigurationManager.ConnectionStrings["Write"].ConnectionString;
static int commandTimeout = 30;
public static IDbConnection GetConnection(bool useWriteConn)
{
if (useWriteConn)
return new SqlConnection(connStrWrite);
return new SqlConnection(connStrRead);
}
public static SqlConnection GetOpenConnection()
{
var conn = new SqlConnection(connStrWrite);
conn.Open();
return conn;
}
/// <summary>
/// 執行sql傳回一個對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static T ExecuteReaderReturnT<T>(string sql, object param = null, bool useWriteConn = false, IDbTransaction transaction = null)
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.QueryFirstOrDefault<T>(sql, param, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.QueryFirstOrDefault<T>(sql, param, commandTimeout: commandTimeout, transaction: transaction);
}
}
/// <summary>
/// 執行sql傳回多個對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static List<T> ExecuteReaderReturnList<T>(string sql, object param = null, bool useWriteConn = false, IDbTransaction transaction = null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.Query<T>(sql, param, commandTimeout: commandTimeout, transaction: transaction).ToList();
}
}
/// <summary>
/// 執行sql傳回一個對象--異步
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static async Task<T> ExecuteReaderRetTAsync<T>(string sql, object param = null, bool useWriteConn = false)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return await conn.QueryFirstOrDefaultAsync<T>(sql, param, commandTimeout: commandTimeout).ConfigureAwait(false);
}
}
/// <summary>
/// 執行sql傳回多個對象--異步
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static async Task<List<T>> ExecuteReaderRetListAsync<T>(string sql, object param = null, bool useWriteConn = false)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
var list = await conn.QueryAsync<T>(sql, param, commandTimeout: commandTimeout).ConfigureAwait(false);
return list.ToList();
}
}
/// <summary>
/// 執行sql,傳回影響行數
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <returns></returns>
public static int ExecuteSqlInt(string sql, object param = null, IDbTransaction transaction = null)
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return conn.Execute(sql, param, commandTimeout: commandTimeout, commandType: CommandType.Text);
}
}
else
{
var conn = transaction.Connection;
return conn.Execute(sql, param, transaction: transaction, commandTimeout: commandTimeout, commandType: CommandType.Text);
}
}
/// <summary>
/// 執行sql,傳回影響行數--異步
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <returns></returns>
public static async Task<int> ExecuteSqlIntAsync(string sql, object param = null, IDbTransaction transaction = null)
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return await conn.ExecuteAsync(sql, param, commandTimeout: commandTimeout, commandType: CommandType.Text).ConfigureAwait(false);
}
}
else
{
var conn = transaction.Connection;
return await conn.ExecuteAsync(sql, param, transaction: transaction, commandTimeout: commandTimeout, commandType: CommandType.Text).ConfigureAwait(false);
}
}
/// <summary>
/// 根據id擷取實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="transaction"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static T GetById<T>(int id, IDbTransaction transaction = null, bool useWriteConn = false) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.Get<T>(id, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.Get<T>(id, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 根據id擷取實體--異步
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="transaction"></param>
/// <param name="useWriteConn"></param>
/// <returns></returns>
public static async Task<T> GetByIdAsync<T>(int id, IDbTransaction transaction = null, bool useWriteConn = false) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return await conn.GetAsync<T>(id, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return await conn.GetAsync<T>(id, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 插入實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item"></param>
/// <param name="transaction"></param>
/// <returns></returns>
public static string ExecuteInsert<T>(T item, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
var res = conn.Insert<T>(item, commandTimeout: commandTimeout);
return res;
}
}
else
{
var conn = transaction.Connection;
return conn.Insert(item, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 批量插入實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="transaction"></param>
public static void ExecuteInsertList<T>(IEnumerable<T> list, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
conn.Insert<T>(list, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
conn.Insert(list, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 更新單個實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item"></param>
/// <param name="transaction"></param>
/// <returns></returns>
public static bool ExecuteUpdate<T>(T item, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return conn.Update(item, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.Update(item, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 批量更新實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item"></param>
/// <param name="transaction"></param>
/// <returns></returns>
public static bool ExecuteUpdateList<T>(List<T> item, IDbTransaction transaction = null) where T : class
{
if (transaction == null)
{
using (IDbConnection conn = GetConnection(true))
{
conn.Open();
return conn.Update(item, commandTimeout: commandTimeout);
}
}
else
{
var conn = transaction.Connection;
return conn.Update(item, transaction: transaction, commandTimeout: commandTimeout);
}
}
/// <summary>
/// 分頁查詢
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql">主sql 不帶 order by</param>
/// <param name="sort">排序内容 id desc,add_time asc</param>
/// <param name="pageIndex">第幾頁</param>
/// <param name="pageSize">每頁多少條</param>
/// <param name="useWriteConn">是否主庫</param>
/// <returns></returns>
public static List<T> ExecutePageList<T>(string sql, string sort, int pageIndex, int pageSize, bool useWriteConn = false, object param = null)
{
string pageSql = @"SELECT TOP {0} * FROM (SELECT ROW_NUMBER() OVER (ORDER BY {1}) _row_number_,* FROM
({2})temp )temp1 WHERE temp1._row_number_>{3} ORDER BY _row_number_";
string execSql = string.Format(pageSql, pageSize, sort, sql, pageSize * (pageIndex - 1));
using (IDbConnection conn = GetConnection(useWriteConn))
{
conn.Open();
return conn.Query<T>(execSql, param, commandTimeout: commandTimeout).ToList();
}
}
}
}
從此山高路遠,縱馬揚鞭。願往後旅途,三冬暖,春不寒,天黑有燈,下雨有傘。此生盡興,不負勇往。