using Dapper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Microsoft.Extensions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System.Linq;
using Dapper.Contrib.Extensions;
using HMXTAPI.Model;
using System.Data.SqlClient;
namespace HMXTAPI.DLL
{
public class DapperHelper
{
private IDbConnection ConnectionObject = null;//连接数据类的对象
private string ConnectionString = "";//连接的字符串
public string DataBaseType { get; set; }
//数据库的类型0=sqlserver,1=access,2=oracle,3=mysql
private IConfiguration _config;
/// <summary>
/// 设置连接的字符串及数据库类型
/// </summary>
/// <param name="str">连接的字符串</param>
/// <param name="_type">数据库类型0=sqlserver,1=access,2=oracle,3=mysql</param>
public DapperHelper(string Kuming="")
{
var Configuration = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
.Build();
_config = Configuration;
DataBaseType = "mssql";
ConnectionString = _config["ConnectionStrings:DB"];
if (Kuming != "")
{
ConnectionString = ConnectionString.Replace("ZZ_HMXT", Kuming);
}
SetConnection();
}
/// <summary>
/// 重新初始化链接
/// </summary>
public void InitConnection(string lianjie, string sqllx)
{
ConnectionObject = null;
ConnectionString = lianjie;
DataBaseType = sqllx;
SetConnection();
}
public void ReinitConnection()
{
CloseConnection();
ConnectionObject = null;
var Configuration = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
.Build();
_config = Configuration;
DataBaseType = "mssql";
ConnectionString = _config["ConnectionStrings:DB"];
SetConnection();
}
/// <summary>
/// 获取事务
/// </summary>
/// <returns></returns>
public IDbTransaction HuoQuTran()
{
OpenConnection();
return ConnectionObject.BeginTransaction();
}
public void InitConnection(string id)
{
//根据id查询数据库信息
string sjkxinxi = "select [ID],[Zdyh],[Zdrq],[gbyh],[gbrq],[Sjkm],[Ms],[Bz],[Sjklb],[Sjkip],[Sjkyh],"
+ "[sjkmm],[ZtfgCS],[ZtfgBS],[xt_zif1],[xt_zif2],[xt_zif3],[xt_zif4],[xt_zif5],[xt_shuz1],[xt_shuz2]"
+ ",[xt_shuz3] from [HMXT_A010000] where [ID]=" + id + "";
DataTable a01000jihe = ExecuteTableSQL(sjkxinxi, null);
string ShuJuKuLianJie = string.Empty;
//判断数据库ip是否为空
if (a01000jihe != null && a01000jihe.Rows.Count > 0)
{
//根据Sjklb判断数据库类别
switch (a01000jihe.Rows[0]["Sjklb"].ToString())
{
case "mmsql":
ShuJuKuLianJie = string.Format("Password={0};Persist Security Info=True;User ID={1};Initial Catalog={2};Data Source={3};MultipleActiveResultSets=true",
a01000jihe.Rows[0]["Sjkmm"].ToString(), a01000jihe.Rows[0]["Sjkyh"].ToString(), a01000jihe.Rows[0]["Sjkm"], a01000jihe.Rows[0]["sjkip"]);
break;
case "access":
ShuJuKuLianJie = string.Format("Provider=microsoft.jet.oledb.4.0;data source={0};user id={1};password={2};",
a01000jihe.Rows[0]["Sjkip"], a01000jihe.Rows[0]["Sjkyh"], a01000jihe.Rows[0]["Sjkmm"]);
break;
case "oracle":
ShuJuKuLianJie = string.Format("data source={0};user id={1};password={2}",
a01000jihe.Rows[0]["sjkip"], a01000jihe.Rows[0]["Sjkyh"], a01000jihe.Rows[0]["Sjkmm"]);
break;
case "mysql":
ShuJuKuLianJie = string.Format("server={0};user={1};pwd={2};database={3}",
a01000jihe.Rows[0]["sjkip"], a01000jihe.Rows[0]["Sjkyh"], a01000jihe.Rows[0]["Sjkmm"], a01000jihe.Rows[0]["Sjkm"]);
break;
default:
ShuJuKuLianJie = string.Format("Password={0};Persist Security Info=True;User ID={1};Initial Catalog={2};Data Source={3};MultipleActiveResultSets=true",
a01000jihe.Rows[0]["Sjkmm"], a01000jihe.Rows[0]["Sjkyh"], a01000jihe.Rows[0]["Sjkm"], a01000jihe.Rows[0]["Sjkip"]);
break;
}
ConnectionObject = null;
ConnectionString = ShuJuKuLianJie;
DataBaseType = a01000jihe.Rows[0]["sjklb"].ToString();
SetConnection();
}
}
/// <summary>
/// 设置连接类的对象
/// </summary>
private void SetConnection()
{
switch (DataBaseType)
{
case "mssql":
ConnectionObject = new System.Data.SqlClient.SqlConnection(ConnectionString);//连接sqlserver
break;
case "access":
ConnectionObject = new System.Data.OleDb.OleDbConnection(ConnectionString);//连接access
break;
case "oracle":
ConnectionObject = new System.Data.OracleClient.OracleConnection(ConnectionString);//连接oracle
//处理办法:
//在oracle 安装目录下 找到 Oracle.DataAccess.dll添加引用,然后 using Oracle.DataAccess.Client;
//其他的都不用动,即可。
//连接字符串中 如有 用的是 user=xxx 就改成user id=xxx
//把原来 Using 的System.Data.OracleClient去掉即可
break;
case "mysql":
ConnectionObject = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString);//连接mysql
break;
}
}
/// <summary>
/// 打开数据库连接
/// </summary>
private void OpenConnection()
{
if (ConnectionObject.State == System.Data.ConnectionState.Closed)
{
ConnectionObject.Open();
}
}
/// <summary>
/// 关闭数据库连接
/// </summary>
private void CloseConnection()
{
if (ConnectionObject.State == System.Data.ConnectionState.Open)
{
ConnectionObject.Close();
}
}
/// <summary>
/// 执行sql并且返回受影响的行数
/// </summary>
/// <param name="sql"></param>
/// <param name="type"></param>
/// <param name="para"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sql, object _param, IDbTransaction _tran = null,bool isEnd=false)
{
lock (ConnectionObject)
{
try
{
OpenConnection();
//_tran = ConnectionObject.BeginTransaction();
return ConnectionObject.Execute(sql, _param, _tran);
}
catch
{
throw;
}
finally
{
if (_tran != null && isEnd)
{
_tran.Commit();
CloseConnection();
}
else if(_tran==null)
{
CloseConnection();
}
}
}
}
/// <summary>
/// 执行sql并且返回首行首列
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public object ExecuteScalar(string sql, object _object, IDbTransaction _tran = null, bool isEnd = false)
{
lock (ConnectionObject)
{
try
{
OpenConnection();
return ConnectionObject.ExecuteScalar(sql, _object);
}
catch
{
throw;
}
finally
{
if (_tran != null && isEnd)
{
_tran.Commit();
CloseConnection();
}
else if (_tran == null)
{
CloseConnection();
}
}
}
}
/// <summary>
/// 执行查询的sql语句,并且返回datatable结果
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public DataTable ExecuteTableSQL(string sql, object _param=null, IDbTransaction _tran = null, bool isEnd = false)
{
lock (ConnectionObject)
{
try
{
OpenConnection();
IDataReader idr = ConnectionObject.ExecuteReader(sql, _param);
return IDataReaderToDataTable(idr);
}
catch
{
throw;
}
finally
{
if (_tran != null && isEnd)
{
_tran.Commit();
CloseConnection();
}
else if (_tran == null)
{
CloseConnection();
}
}
}
}
/// <summary>
/// 执行查询的sql语句,并且返回datatable结果
/// </summary>
/// <param name="columns">列</param>
/// <param name="tableName">表名</param>
/// <param name="where">条件</param>
/// <param name="orderby">排序</param>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">页尺寸</param>
/// <param name="total">总行数</param>
/// <param name="_param">参数</param>
/// <param name="_tran">事务</param>
/// <returns></returns>
public DataTable HuoQuExecuteTable(string columns, string tableName, string where, string orderby, int pageIndex, int pageSize, out int total,object _param = null)
{
//声明变量
DataTable dtJieGuo = new DataTable();
total = 0;
lock (ConnectionObject)
{
try
{
OpenConnection();
StringBuilder sb = new StringBuilder();
int skip = 1;
//当前行数
if (pageIndex > 0)
{
skip = (pageIndex - 1) * pageSize + 1;
}
switch (DataBaseType)
{
case "mssql":
sb.AppendFormat("SELECT COUNT(1) FROM {0} where {1};", tableName, where);
sb.AppendFormat(@"SELECT {0}
FROM(SELECT ROW_NUMBER() OVER(ORDER BY {3}) AS RowNum,{0}
FROM {1}
WHERE {2}
) AS result
WHERE RowNum >= {4} AND RowNum <= {5}
ORDER BY {3}", columns, tableName, where, orderby, skip, pageIndex * pageSize);
break;
case "access":
sb.AppendFormat("SELECT COUNT(1) FROM {0} where {1};", tableName, where);
int maxrows = (int)ExecuteScalar(sb.ToString(),null);
int maxpage = (maxrows % pageSize == 0) ? (maxrows / pageSize) : (maxrows / pageSize + 1);
int lastcount = (maxrows % pageSize == 0) ? (pageSize) : (maxrows % pageSize);
int rang = (maxpage + 1 - pageIndex) * pageSize;
if (pageIndex < maxpage)
{
sb.AppendFormat("select top {0} {1} from (select top {2} {3} from {4} where {5} order by {6}) order by {6}",
pageSize,columns,rang,columns,tableName, where,orderby);
}
else
{
sb.AppendFormat("select top {0} {1} from (select top {2} {3} from {4} where {5} order by {6}) order by {7}",
lastcount, columns, lastcount, columns, tableName, where, orderby);
}
break;
case "oracle":
sb.AppendFormat("SELECT COUNT(1) FROM {0} where {1};", tableName, where);
sb.AppendFormat(@"SELECT *
FROM (SELECT {0}, ROWNUM AS rowno
FROM (SELECT {0}
FROM {1}
WHERE {2} ORDER BY {3}) tt
WHERE ROWNUM <={5} ) table_alias
WHERE table_alias.rowno >= {4};", columns, tableName, where, orderby, skip, pageIndex * pageSize); ;//连接oracle
break;
case "mysql":
sb.AppendFormat("SELECT COUNT(1) FROM {0} where {1};", tableName, where);
sb.AppendFormat(@"SELECT {0}
FROM(SELECT ROW_NUMBER() OVER(ORDER BY {3}) AS RowNum,{0}
FROM {1}
WHERE {2}
) AS result
WHERE RowNum >= {4} AND RowNum <= {5}
ORDER BY {3}", columns, tableName, where, orderby, skip, pageIndex * pageSize);
break;
}
IDataReader idr = ConnectionObject.ExecuteReader(sb.ToString(), _param);
DataSet dt = new DataSet();
dt.Load(idr,LoadOption.PreserveChanges, new String[] { "totolCount", "totolList" });
if (dt != null && dt.Tables != null && dt.Tables.Count > 0)
{
total = int.Parse(dt.Tables[0].Rows[0][0].ToString());
if (dt.Tables.Count > 1)
{
dtJieGuo = dt.Tables[1];
}
}
return dtJieGuo;
}
catch
{
throw;
}
finally
{
CloseConnection();
}
}
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="_object"></param>
/// <returns></returns>
public List<T> ExecuteQuerySQL<T>(string sql, object _object)
{
lock (ConnectionObject)
{
try
{
OpenConnection();
var r = ConnectionObject.Query<T>(sql, _object);
return r.ToList<T>();
}
catch
{
throw;
}
finally
{
CloseConnection();
}
}
}
/// <summary>
/// 把idatareader转换成datatable
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
private DataTable IDataReaderToDataTable(IDataReader reader)
{
DataTable objDataTable = new DataTable();
int intFieldCount = reader.FieldCount;
for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
{
objDataTable.Columns.Add(reader.GetName(intCounter), typeof(string));
}
objDataTable.BeginLoadData();
object[] objValues = new object[intFieldCount];
while (reader.Read())
{
reader.GetValues(objValues);
objDataTable.LoadDataRow(objValues, true);
}
reader.Close();
objDataTable.EndLoadData();
return objDataTable;
}
#region 2020-09-27 lzy 新加sql查询方法,主要是参数化查询
private static void PrepareCommand(SqlCommand sqlCommand, SqlParameter[] commandParms)
{
if (commandParms != null)
{
foreach (SqlParameter parameter in commandParms)
{
if (parameter.Value == null)
{
parameter.Value = DBNull.Value;
}
sqlCommand.Parameters.Add(parameter);
}
}
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <param name="cmdParms">SqlParameter对象可以为空</param>
/// <returns>DataSet</returns>
public DataSet Query(string SQLString, params SqlParameter[] cmdParms)
{
//创建连接对象
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand();
//设置要运行的sql语句或存储过程
cmd.CommandText = SQLString;
//设置cmd的连接
cmd.Connection = con;
//设置cmd运行的命令的类型
cmd.CommandType = CommandType.Text;
//参数不为空的话,添加参数
PrepareCommand(cmd, cmdParms);
//if (cmdParms != null)
// cmd.Parameters.AddRange(cmdParms);
con.Open();
//创建数据适配器
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public int ExecuteSqlTran(List<String> SQLStringList)
{
//if (sqlcon.State.ToString().ToUpper() == "CLOSED")
//{
// sqlcon = GetNewConnection();
//}
using (SqlConnection sqlcon = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlcon;
sqlcon.Open();
SqlTransaction tx = sqlcon.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit();
sqlcon.Close();
return count;
}
catch
{
tx.Rollback();
return 0;
}
}
}
/// <summary>
/// 执行SQL语句,返回是否成功。
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="commandParm">SqlParameter对象可以为空</param>
public int ExecuteNonQuery(string commandText, SqlParameter[] commandParm)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = commandText;
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
PrepareCommand(cmd, commandParm);
//if (commandParm != null)
// cmd.Parameters.AddRange(commandParm);
con.Open();
// cmd.Parameters["@Info"].Direction = ParameterDirection.Output;
int rows = cmd.ExecuteNonQuery();
return rows;
}
}
/// <summary>
/// 执行存储过程,返回影响的行数
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="rowsAffected">影响的行数</param>
/// <returns></returns>
public int RunProcedure(string storedProcName, IDataParameter[] parameters)
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
int result;
connection.Open();
SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
//Connection.Close();
return result;
}
}
/// <summary>
/// 创建 SqlCommand 对象实例(用来返回一个整数值)
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand 对象实例</returns>
private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
command.Parameters.Add(new SqlParameter("ReturnValue",
SqlDbType.Int, 4, ParameterDirection.ReturnValue,
false, 0, 0, string.Empty, DataRowVersion.Default, null));
return command;
}
/// <summary>
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand</returns>
private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parameter in parameters)
{
if (parameter != null)
{
// 检查未分配值的输出参数,将其分配以DBNull.Value.
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
}
}
return command;
}
/// <summary>
/// dapper通用分页方法
/// </summary>
/// <typeparam name="T">泛型集合实体类</typeparam>
/// <param name="conn">数据库连接池连接对象</param>
/// <param name="files">列</param>
/// <param name="tableName">表</param>
/// <param name="where">条件</param>
/// <param name="orderby">排序</param>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">当前页显示条数</param>
/// <param name="total">结果集总数</param>
/// <returns></returns>
public static IEnumerable<T> GetPageList<T>(IDbConnection conn, string files, string tableName, string where, string orderby, int pageIndex, int pageSize, out int total)
{
int skip = 1;
if (pageIndex > 0)
{
skip = (pageIndex - 1) * pageSize + 1;
}
StringBuilder sb = new StringBuilder();
sb.AppendFormat("SELECT COUNT(1) FROM {0} where {1};", tableName, where);
sb.AppendFormat(@"SELECT {0}
FROM(SELECT ROW_NUMBER() OVER(ORDER BY {3}) AS RowNum,{0}
FROM {1}
WHERE {2}
) AS result
WHERE RowNum >= {4} AND RowNum <= {5}
ORDER BY {3}", files, tableName, where, orderby, skip, pageIndex * pageSize);
using (var reader = conn.QueryMultiple(sb.ToString()))
{
total = reader.ReadFirst<int>();
return reader.Read<T>();
}
}
#endregion
}
}