释蝉

博客园 首页 新随笔 联系 订阅 管理
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

    }
}

  

posted on 2020-10-22 16:03  释蝉  阅读(99)  评论(0编辑  收藏  举报