345 lines
11 KiB
C#
345 lines
11 KiB
C#
using Dapper;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Configuration;
|
|
using System.Data;
|
|
using MySql.Data.MySqlClient;
|
|
using System.Linq;
|
|
using System.Data.SqlClient;
|
|
using System.Collections;
|
|
using System.Reflection;
|
|
|
|
namespace JY.DAL
|
|
{
|
|
public class SqlHelper<T> where T : class
|
|
{
|
|
/// <summary>
|
|
/// 数据库连接字符串
|
|
/// </summary>
|
|
private static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString;
|
|
|
|
/// <summary>
|
|
/// 查询列表
|
|
/// </summary>
|
|
/// <param name="sql">查询的sql</param>
|
|
/// <param name="param">替换参数</param>
|
|
/// <returns></returns>
|
|
public static List<T> Query(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.Query<T>(sql, param).ToList();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询第一个数据
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static T QueryFirst(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.QueryFirst<T>(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询第一个数据没有返回默认值
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static T QueryFirstOrDefault(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.QueryFirstOrDefault<T>(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询单条数据
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static T QuerySingle(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.QuerySingle<T>(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询单条数据没有返回默认值
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static T QuerySingleOrDefault(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.QuerySingleOrDefault<T>(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 增删改
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns>Number of rows affected</returns>
|
|
public static int Execute(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.Execute(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reader获取数据
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static IDataReader ExecuteReader(string sql, object param)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.ExecuteReader(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取数据返回DataTable
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static DataTable QueryTable(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
DataTable table = new DataTable();
|
|
var reader = con.ExecuteReader(sql, param);
|
|
table.Load(reader);
|
|
return table;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Scalar获取数据
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static object ExecuteScalar(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.ExecuteScalar(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Scalar获取数据
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static T ExecuteScalarForT(string sql, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
return con.ExecuteScalar<T>(sql, param);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 带参数的存储过程
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static List<T> ExecutePro(string proc, object param = null)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
List<T> list = con.Query<T>(proc,
|
|
param,
|
|
null,
|
|
true,
|
|
null,
|
|
CommandType.StoredProcedure).ToList();
|
|
return list;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 批量插入T数据,返回影响行数
|
|
/// </summary>
|
|
/// <param name="list">对象集合</param>
|
|
/// <returns>影响行数</returns>
|
|
public static int Insert(string strsql, List<T> list)
|
|
{
|
|
using (IDbConnection connection = new SqlConnection(connectionString))
|
|
{
|
|
//return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", list);
|
|
return connection.Execute(strsql, list);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// list to datatable
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="collection"></param>
|
|
/// <returns></returns>
|
|
public static DataTable ListToDt(IEnumerable<T> collection)
|
|
{
|
|
var props = typeof(T).GetProperties();
|
|
var dt = new DataTable();
|
|
dt.Columns.AddRange(props.Select(p => new
|
|
DataColumn(p.Name, p.PropertyType)).ToArray());
|
|
if (collection.Count() > 0)
|
|
{
|
|
for (int i = 0; i < collection.Count(); i++)
|
|
{
|
|
ArrayList tempList = new ArrayList();
|
|
foreach (PropertyInfo pi in props)
|
|
{
|
|
object obj = pi.GetValue(collection.ElementAt(i), null);
|
|
tempList.Add(obj);
|
|
}
|
|
object[] array = tempList.ToArray();
|
|
dt.LoadDataRow(array, true);
|
|
}
|
|
}
|
|
return dt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 批量插入SqlBulkCopy
|
|
/// </summary>
|
|
/// <param name="dt"></param>
|
|
/// <param name="tableName">表名</param>
|
|
public static void BatchInsertBySqlBulkCopy(DataTable dt, string tableName)
|
|
{
|
|
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString))
|
|
{
|
|
sbc.BatchSize = dt.Rows.Count;
|
|
sbc.BulkCopyTimeout = 10;
|
|
sbc.DestinationTableName = tableName;
|
|
|
|
sbc.ColumnMappings.Clear();
|
|
//sbc.ColumnMappings.Add("CustomerID", "CustomerID");
|
|
//sbc.ColumnMappings.Add("FirstName", "FirstName");
|
|
//sbc.ColumnMappings.Add("LastName", "LastName");
|
|
//sbc.ColumnMappings.Add("Address1", "Address1");
|
|
//sbc.ColumnMappings.Add("Address2", "Address2");
|
|
for (int i = 0; i < dt.Columns.Count; i++)
|
|
{
|
|
sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
|
|
}
|
|
//全部写入数据库
|
|
sbc.WriteToServer(dt);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 批量插入数据
|
|
/// </summary>
|
|
/// <param name="dt"></param>
|
|
public static int BulkToDB(string tableName, List<T> list)
|
|
{
|
|
//int result = 0;
|
|
DataTable dt = ListToDt(list);
|
|
BatchInsertBySqlBulkCopy(dt, tableName);
|
|
return 1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 事务1 - 全SQL
|
|
/// </summary>
|
|
/// <param name="sqlarr">多条SQL</param>
|
|
/// <param name="param">param</param>
|
|
/// <returns></returns>
|
|
public static int ExecuteTransaction(string[] sqlarr)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
con.Open();
|
|
using (var transaction = con.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
int result = 0;
|
|
foreach (var sql in sqlarr)
|
|
{
|
|
result += con.Execute(sql, null, transaction);
|
|
}
|
|
|
|
transaction.Commit();
|
|
return result;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
con.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 事务2 - 声明参数
|
|
///demo:
|
|
///dic.Add("Insert into Users values (@UserName, @Email, @Address)",
|
|
/// new { UserName = "jack", Email = "380234234@qq.com", Address = "上海" });
|
|
/// </summary>
|
|
/// <param name="Key">多条SQL</param>
|
|
/// <param name="Value">param</param>
|
|
/// <returns></returns>
|
|
public static int ExecuteTransaction(Dictionary<string, object> dic)
|
|
{
|
|
using (SqlConnection con = new SqlConnection(connectionString))
|
|
{
|
|
con.Open();
|
|
using (var transaction = con.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
int result = 0;
|
|
foreach (var sql in dic)
|
|
{
|
|
result += con.Execute(sql.Key, sql.Value, transaction);
|
|
}
|
|
|
|
transaction.Commit();
|
|
return result;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
throw ex;
|
|
}
|
|
finally
|
|
{
|
|
con.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |