using Dapper;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using VOL.Core.Const;
using VOL.Core.DBManager;
using VOL.Core.Enums;
using VOL.Core.Extensions;
namespace VOL.Core.Dapper
{
public class SqlDapper : ISqlDapper
{
private string _connectionString;
private int? commandTimeout = null;
private DbCurrentType _dbCurrentType;
public SqlDapper()
{
_connectionString = DBServerProvider.GetConnectionString();
}
public SqlDapper(string connKeyName, DbCurrentType dbCurrentType)
{
_dbCurrentType = dbCurrentType;
_connectionString = DBServerProvider.GetConnectionString(connKeyName);
}
public SqlDapper(string connKeyName)
{
_connectionString = DBServerProvider.GetConnectionString(connKeyName);
}
private bool _transaction { get; set; }
private IDbConnection _transactionConnection = null;
///
/// 超时时间(秒)
///
///
///
public ISqlDapper SetTimout(int timeout)
{
this.commandTimeout = timeout;
return this;
}
private T Execute(Func func, bool beginTransaction = false)
{
if (_transaction|| dbTransaction!=null)
{
return func(_transactionConnection, dbTransaction);
}
if (beginTransaction)
{
return ExecuteTransaction(func);
}
using (var connection = DBServerProvider.GetDbConnection(_connectionString, _dbCurrentType))
{
return func(connection, dbTransaction);
}
}
private T ExecuteTransaction(Func func)
{
using (_transactionConnection = DBServerProvider.GetDbConnection(_connectionString, _dbCurrentType))
{
try
{
_transactionConnection.Open();
dbTransaction = _transactionConnection.BeginTransaction();
T reslutT = func(_transactionConnection, dbTransaction);
dbTransaction.Commit();
return reslutT;
}
catch (Exception ex)
{
dbTransaction?.Rollback();
throw new Exception(ex.Message,ex);
}
finally
{
dbTransaction?.Dispose();
}
}
}
private async Task ExecuteAsync(Func> funcAsync, bool beginTransaction = false)
{
if (_transaction|| dbTransaction!=null)
{
return await funcAsync(_transactionConnection, dbTransaction);
}
if (beginTransaction)
{
return await ExecuteTransactionAsync(funcAsync);
}
using (var connection = DBServerProvider.GetDbConnection(_connectionString, _dbCurrentType))
{
T reslutT = await funcAsync(connection, dbTransaction);
if (!_transaction && dbTransaction != null)
{
dbTransaction.Commit();
}
return reslutT;
}
}
private async Task ExecuteTransactionAsync(Func> funcAsync)
{
using (var connection = DBServerProvider.GetDbConnection(_connectionString, _dbCurrentType))
{
try
{
connection.Open();
dbTransaction = connection.BeginTransaction();
T reslutT = await funcAsync(connection, dbTransaction);
if (!_transaction && dbTransaction != null)
{
dbTransaction.Commit();
}
return reslutT;
}
catch (Exception ex)
{
dbTransaction?.Rollback();
throw new Exception(ex.Message,ex);
}
}
}
///
/// 2020.06.15增加Dapper事务处理
///
///
public void BeginTransaction(Func action, Action error)
{
_transaction = true;
using (var connection = DBServerProvider.GetDbConnection(_connectionString, _dbCurrentType))
{
try
{
_transactionConnection = connection;
_transactionConnection.Open();
dbTransaction = _transactionConnection.BeginTransaction();
bool result = action(this);
if (result)
{
dbTransaction?.Commit();
}
else
{
dbTransaction?.Rollback();
}
}
catch (Exception ex)
{
dbTransaction?.Rollback();
error(ex);
}
finally
{
_transaction = false;
dbTransaction?.Dispose();
}
}
}
///
/// var p = new object();
// p.Add("@a", 11);
//p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
//p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
// ///
///
///
///
///
///
public List QueryList(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return Execute((conn, dbTransaction) =>
{
return conn.Query(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout).ToList();
}, beginTransaction);
}
public async Task> QueryListAsync(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return await ExecuteAsync(async (conn, dbTransaction) =>
{
return await conn.QueryAsync(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public async Task QueryFirstAsync(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false) where T : class
{
return await ExecuteAsync(async (conn, dbTransaction) =>
{
return await conn.QueryFirstOrDefaultAsync(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public T QueryFirst(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false) where T : class
{
return Execute((conn, dbTransaction) =>
{
return conn.QueryFirstOrDefault(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public async Task QueryDynamicFirstAsync(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return await ExecuteAsync(async (conn, dbTransaction) =>
{
return await conn.QueryFirstOrDefaultAsync(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public dynamic QueryDynamicFirst(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return Execute((conn, dbTransaction) =>
{
return conn.QueryFirstOrDefault(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public async Task QueryDynamicListAsync(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return await ExecuteAsync(async (conn, dbTransaction) =>
{
return await conn.QueryAsync(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout);
}, beginTransaction);
}
public List QueryDynamicList(string cmd, object param, CommandType? commandType = null, bool beginTransaction = false)
{
return Execute((conn, dbTransaction) =>
{
return conn.Query(cmd, param, dbTransaction, commandType: commandType ?? CommandType.Text, commandTimeout: commandTimeout).ToList();
}, beginTransaction);
}
public async Task