using Dapper;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using ToneCommon.CommonMethod;
namespace ToneFramework
{
public sealed class DapperHelper
{
static readonly DapperHelper instance = null;
private static IConfiguration Configuration = ConfigurationHelper.GetConfiguration("appsettings.json");
private static string ConnectionStr = Configuration["SQLServer"];
private DapperHelper()
{
}
static DapperHelper()
{
instance = new DapperHelper();
}
/// <summary>
/// 获取实例
/// </summary>
/// <returns></returns>
public static DapperHelper GetInstance()//string connectionString
{
return instance;
}
/// <summary>
/// 获取数据连接
/// </summary>
/// <returns></returns>
public SqlConnection GetConnection()
{
SqlConnection connection = new SqlConnection(ConnectionStr); //这里sqlconnection就是数据库连接字符串
return connection;
}
/// <summary>
/// 打开获取的连接
/// </summary>
/// <returns></returns>
public SqlConnection OpenConnection()
{
SqlConnection connection = GetConnection();
connection.Open();
return connection;
}
/// <summary>
/// 插入 一个实体
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="entity"></param>
/// <returns>实体id</returns>
public Guid Insert<TEntity>(TEntity entity) where TEntity : DBBaseModel
{
if (entity == null)
{
throw new Exception("传入数据不可为null!");
}
if (entity.Id == Guid.Empty)
{
throw new Exception("传入数据Id不可为空!");
}
Type type = typeof(TEntity);
var propArray = type.GetProperties();//.Where(p => !p.Name.Equals("Id"));
string columnString = string.Join(",", propArray.Select(p => $"[{p.Name}] "));
string valuesString = string.Join(",", propArray.Select(p => $"@{p.Name} "));
string sql = $" INSERT INTO [{type.Name}] ( {columnString} ) VALUES ( {valuesString} ) ; ";
using (SqlConnection conn = OpenConnection())
{
if (GetConnection().Execute(sql, entity) < 1)
{
throw new Exception("插入不成功。");
}
}
return entity.Id;
}
/// <summary>
/// 执行选择单个值的参数化SQL。
/// </summary>
/// <param name="sql"></param>
/// <returns>返回类型。</returns>
public T ExecuteScalar<T>(string sql, object param = null)
{
using (SqlConnection conn = OpenConnection())
{
return SqlMapper.ExecuteScalar<T>(conn, sql, param);
}
}
/// <summary>
/// 根据id 查询实体
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
public TEntity GetById<TEntity>(Guid id) where TEntity : DBBaseModel
{
using (IDbConnection cnn = OpenConnection())
{
string sql = $"SELECT * FROM [{typeof(TEntity).Name}] WHERE Id={id} ";
return cnn.Query<TEntity>(sql).FirstOrDefault();
}
}
/// <summary>
/// 修改实体
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="entity"></param>
public void Update<TEntity>(TEntity entity) where TEntity : DBBaseModel
{
if (entity == null)
{
throw new Exception("传入数据不可为null!");
}
Type type = typeof(TEntity);
var propArray = type.GetProperties().Where(p => !p.Name.Equals("Id"));
string columnString = string.Join(",", propArray.Select(p => $"[{p.Name}]=@{p.Name}"));
string sql = $"UPDATE [{type.Name}] SET {columnString} WHERE Id={entity.Id} ";
using (SqlConnection conn = OpenConnection())
{
if (GetConnection().Execute(sql, entity) < 1)
{
throw new Exception("Update数据不存在");
}
}
}
/// <summary>
/// 根据 实体 id 删除 实体
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="id"></param>
public void Delete<TEntity>(int id) where TEntity : DBBaseModel
{
int affectCount = 0;
string sql = $"SELECT * FROM [{typeof(TEntity).Name}] WHERE Id={id} ";
using (SqlConnection conn = OpenConnection())
{
using (SqlCommand command = new SqlCommand(sql, conn))
{
affectCount = command.ExecuteNonQuery();
if (affectCount == 0)
{
throw new Exception("Delete数据不存在");
}
}
}
}
/// <summary>
/// 执行 sql 语句 返回影响行数
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public int ExecuteSql(string sql, object param = null)
{
using (SqlConnection conn = OpenConnection())
{
return conn.Execute(sql, param);
}
}
/// <summary>
/// 执行sql 语句返回 结果集
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public IEnumerable<dynamic> Query(string sql, object param = null)
{
using (SqlConnection conn = OpenConnection())
{
return SqlMapper.Query(conn, sql, param);
}
}
/// <summary>
/// 执行sql 语句返回 结果集
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public IEnumerable<T> Query<T>(string sql, object param = null) where T : class, new()
{
using (SqlConnection conn = OpenConnection())
{
return SqlMapper.Query<T>(conn, sql, param);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ToneFramework
{
/// <summary>
/// 数据库 基础model (主要用于约束 主键)
/// </summary>
public class DBBaseModel
{
/// <summary>
/// 主键
/// </summary>
public Guid Id { get; set; }
}
}