SqlHelper类的封装

这是一个.NET框架下的数据库操作类库,提供了包括创建事务、执行SQL(NonQuery、Query、Scalar)、分页查询以及SqlBulkCopy批量更新数据的功能。类库支持多种数据库操作,如在事务中执行SQL语句,返回受事务影响的行数,执行查询并返回DataSet或DataTable,以及执行分页查询等。此外,还包含了对数据库连接、事务处理和错误处理的逻辑。
摘要由CSDN通过智能技术生成
using System;
using System.Data;
using System.Data.Common;
using System.Text;
 
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.ComponentModel;

namespace ConsoleApp3
{
    /// <summary>
    /// 数据库操作基类
    /// </summary>
    public class SqlHelper  
    {
        #region Transaction
        public DbTransaction CreateDbTransaction(string connectionString)
        {
            SqlConnection conn = new SqlConnection(connectionString);
            if (conn.State != ConnectionState.Open)
                conn.Open();
            DbTransaction tran = conn.BeginTransaction();
            return tran;
        }
        #endregion

        #region ExequteNonQuery
        /// <summary>
        /// 执行 Transact-SQL 语句并返回受影响的行数。
        /// </summary>
        public int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();

                int val = 0;
                SqlCommand cmd = conn.CreateCommand();
                if (cmdType == CommandType.StoredProcedure)
                {

                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    val = cmd.ExecuteNonQuery();
                }
                else
                {
                    SqlTransaction tran = conn.BeginTransaction();
                    try
                    {
                        PrepareCommand(cmd, conn, tran, cmdType, cmdText, cmdParms);
                        val = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }
                }
                return val;
            }
        }


        /// <summary>
        /// 在事务中执行 Transact-SQL 语句并返回受影响的行数。
        /// </summary>
        public int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }

        #endregion

        #region ExecuteQuery
        /// <summary>
        /// 执行查询,返回DataSet
        /// </summary>
        public DataSet ExecuteQuery(string connectionString, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                        return ds;
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询,返回DataTable
        /// </summary>
        public DataTable ExecuteQueryToDataTable(string connectionString, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        DataTable ds = new DataTable();
                        da.Fill(ds);
                        cmd.Parameters.Clear();
                        return ds;
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询,返回DataTable
        /// </summary>
        public DataTable ExecuteQueryToDataTable(string connectionString, CommandType cmdType, string cmdText, bool withKey,
            params DbParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        DataTable ds = new DataTable();
                        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                        da.Fill(ds);
                        cmd.Parameters.Clear();
                        return ds;
                    }
                }
            }
        }
        /// <summary>
        /// 执行查询,返回DataTable
        /// </summary>
        public void ExecuteQueryToDataTable(string connectionString, DataTable dt, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(dt);
                        cmd.Parameters.Clear();
                    }
                }
            }
        }

        /// <summary>
        /// 在事务中执行查询,返回DataSet
        /// </summary>
        public DataSet ExecuteQuery(DbTransaction trans, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds, "ds");
            cmd.Parameters.Clear();
            return ds;
        }
        #endregion

        #region Execute Reader
        /// <summary>
        /// 执行查询,返回DataReader
        /// </summary>
        public DbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {

            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlCommand cmd = conn.CreateCommand();
                try
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    cmd.Parameters.Clear();
                    return rdr;
                }
                catch (Exception e)
                {
                    conn.Close();
                    throw e;
                }
            }
        }
        /// <summary>
        /// 在事务中执行查询,返回DataReader
        /// </summary>
        public DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return rdr;
        }

        #endregion

        #region Execute Scalar
        /// <summary>
        /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
        /// </summary>
        public object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                PrepareCommand(cmd, connection, null, cmdType, cmdText, cmdParms);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        /// 在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
        /// </summary>
        public object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText,
            params DbParameter[] cmdParms)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }
        #endregion

        #region Page List
        /// <summary>
        /// 获取分页SQL
        /// </summary>
        /// <param name="strCondition">条件</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="pageIndex">第几页</param>
        /// <param name="fldSort">排序字段(最后一个不需要填写正序还是倒序,例如:id asc, name)</param>
        /// <param name="tblName">表名</param>
        /// <param name="sort">最后一个排序字段的正序或倒序(true为倒序,false为正序)</param>
        /// <returns>返回用于分页的SQL语句</returns>
        private string GetPagerSQL(string condition, int pageSize, int pageIndex, string fldSort,
            string tblName, bool sort)
        {
            string strSort = sort ? " DESC" : " ASC";

            if (pageIndex == 1)
            {
                return "select top " + pageSize.ToString() + " * from " + tblName.ToString()
                    + ((string.IsNullOrEmpty(condition)) ? string.Empty : (" where " + condition))
                    + " order by " + fldSort.ToString() + strSort;
            }
            else
            {
                StringBuilder strSql = new StringBuilder();
                strSql.AppendFormat("select top {0} * from {1} ", pageSize, tblName);
                strSql.AppendFormat(" where {1} not in (select top {0} {1} from {2} ", pageSize * (pageIndex - 1),
                    (fldSort.Substring(fldSort.LastIndexOf(',') + 1, fldSort.Length - fldSort.LastIndexOf(',') - 1)), tblName);
                if (!string.IsNullOrEmpty(condition))
                {
                    strSql.AppendFormat(" where {0} order by {1}{2}) and {0}", condition, fldSort, strSort);
                }
                else
                {
                    strSql.AppendFormat(" order by {0}{1}) ", fldSort, strSort);
                }
                strSql.AppendFormat(" order by {0}{1}", fldSort, strSort);
                return strSql.ToString();
            }
        }
        /// <summary>
        /// Top 分页For Sql server 2000
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="tblName"></param>
        /// <param name="pageSize"></param>
        /// <param name="pageIndex"></param>
        /// <param name="fldSort"></param>
        /// <param name="sort"></param>
        /// <param name="condition"></param>
        /// <returns></returns>
        public DataTable GetPageListTable(string connectionString, string tblName, int pageSize,
            int pageIndex, string fldSort, bool sort, string condition, out int pageCount, out int count)
        {

            StringBuilder strSql = new StringBuilder();
            strSql.AppendLine("SELECT count(0) from " + tblName + ";");
            strSql.AppendLine(GetPagerSQL(condition, pageSize, pageIndex, fldSort, tblName, sort));
            DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString());
            count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
            pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
            return ds.Tables[1];

        }
        /// <summary>
        /// 分页获取数据
        /// </summary>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="tblName">表名</param>
        /// <param name="fldName">字段名</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="pageIndex">第几页</param>
        /// <param name="fldSort">排序字段</param>
        /// <param name="sort">升序{False}/降序(True)</param>
        /// <param name="condition">条件(不需要where)</param>
        public DbDataReader GetPageList(string connectionString, string tblName, int pageSize,
            int pageIndex, string fldSort, bool sort, string condition)
        {
            string sql = GetPagerSQL(condition, pageSize, pageIndex, fldSort, tblName, sort);
            return ExecuteReader(connectionString, CommandType.Text, sql, null);
        }
        /// <summary>
        /// 分页获取数据(Sql Server 2005) for ROW_NUMBER()
        /// </summary>
        /// <param name="connectionString">数据库链接</param>
        /// <param name="sql">获取数据集的Sql</param>
        /// <param name="fldSort">排序字段,可以多个</param>
        /// <param name="pageSize">每页显示多少条</param>
        /// <param name="curPage">当前页码</param>
        /// <param name="pageCount">总页数</param>
        /// <param name="count">总记录数</param>
        ///<param name="cmdParms">DbParameter</param>
        /// <returns>DataTable</returns>
        public DataTable PageList(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.AppendFormat(@"SELECT count(0) from ({0}) as MyTableCount;
                                    select * from (
                                    SELECT ROW_NUMBER() OVER({1}) PageRowNumber,* 
                                    from ({0}) mytable
                                    ) mytable2
                                    where PageRowNumber between {2} and {3}"
                               , sql, fldSort, Convert.ToString((curPage - 1) * pageSize + 1), Convert.ToString((curPage * pageSize)));

            DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
            count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
            pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
            return ds.Tables[1];
        }

        /// <summary>
        /// 分页获取数据(Sql Server 2005) for ROW_NUMBER()
        /// </summary>
        /// <param name="connectionString">数据库链接</param>
        /// <param name="sql">获取数据集的Sql</param>
        /// <param name="fldSort">排序字段,可以多个</param>
        /// <param name="pageSize">每页显示多少条</param>
        /// <param name="curPage">当前页码</param>
        /// <param name="pageCount">总页数</param>
        /// <param name="count">总记录数</param>
        ///<param name="cmdParms">DbParameter</param>
        /// <returns>DataTable</returns>
        public DataTable PageListTask(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
        {
            DataTable dt = null;
            int _count = 0;
            int _pageCount = 0;
            var taskList = new List<Task>();
            taskList.Add(Task.Run(() => {
                StringBuilder strSqlCount = new StringBuilder();
                strSqlCount.AppendFormat(@"SELECT count(0) from ({0}) as MyTableCount;"
                                   , sql);
                DataSet dsCount = ExecuteQuery(connectionString, CommandType.Text, strSqlCount.ToString(), cmdParms);
                _count = Convert.ToInt32(dsCount.Tables[0].Rows[0][0]);
                _pageCount = Convert.ToInt32(Math.Ceiling((double)_count / (double)pageSize));
            }));
            taskList.Add(Task.Run(() => {
                StringBuilder strSql = new StringBuilder();
                strSql.AppendFormat(@"select * from (
                                    SELECT ROW_NUMBER() OVER({1}) PageRowNumber,* 
                                    from ({0}) mytable
                                    ) mytable2
                                    where PageRowNumber between {2} and {3}"
                                   , sql, fldSort, Convert.ToString((curPage - 1) * pageSize + 1), Convert.ToString((curPage * pageSize)));

                DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
                dt = ds.Tables[0];
            }));
            Task.WaitAll(taskList.ToArray());
            count = _count;
            pageCount = _pageCount;
            return dt;
        }

        /// <summary>
        /// 分页获取数据(Sql Server 2005) for ROW_NUMBER()
        /// </summary>
        /// <param name="connectionString">数据库链接</param>
        /// <param name="sql">获取数据集的Sql</param>
        /// <param name="fldSort">排序字段,可以多个</param>
        /// <param name="pageSize">每页显示多少条</param>
        /// <param name="curPage">当前页码</param>
        /// <param name="pageCount">总页数</param>
        /// <param name="count">总记录数</param>
        ///<param name="cmdParms">DbParameter</param>
        /// <returns>DataTable</returns>
        public DataTable PageListTest(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.AppendFormat(@"
                                    SELECT count(0) from ({0}) as MyTableCount;
                                    select *
                                    from ({0}) a
                                    {1}
                                    offset {2} rows
                                    fetch next {3} rows only"
                               , sql, fldSort, Convert.ToString((curPage - 1) * pageSize), pageSize);

            DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
            count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
            pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
            return ds.Tables[1];
        }
        /// <summary>
        /// PageList for DataReader
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="sql"></param>
        /// <param name="pageSize"></param>
        /// <param name="curPage"></param>
        /// <param name="pageCount"></param>
        /// <param name="count"></param>
        /// <param name="cmdParms"></param>
        /// <returns></returns>
        public DataTable PageListReader(string connectionString, CommandType cmdType, string cmdSql, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
        {
            int first = 0;
            int last = 0;
            int fieldCount = 0;
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlCommand cmd = conn.CreateCommand();
                // Log.LogHelper.Instance.Info(cmdSql);
                PrepareCommand(cmd, conn, null, cmdType, cmdSql, cmdParms);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                DataTable dt = new DataTable();
                fieldCount = reader.FieldCount;
                for (int i = 0; i < fieldCount; i++)
                {
                    DataColumn col = new DataColumn();
                    col.ColumnName = reader.GetName(i);
                    col.DataType = reader.GetFieldType(i);
                    dt.Columns.Add(col);
                }
                DataColumn PageRowNumber = new DataColumn();
                PageRowNumber.ColumnName = "PageRowNumber";
                PageRowNumber.DataType = typeof(int);
                dt.Columns.Add(PageRowNumber);

                count = 0;
                first = (curPage - 1) * pageSize + 1;
                last = curPage * pageSize;
                while (reader.Read())
                {
                    count++;
                    if (count >= first && last >= count)
                    {
                        DataRow r = dt.NewRow();
                        for (int i = 0; i < fieldCount; i++)
                        {
                            r[i] = reader[i];
                        }
                        r["PageRowNumber"] = count;
                        dt.Rows.Add(r);
                    }
                }
                reader.Close();
                if (pageSize != 0)
                    pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
                else
                    pageCount = 0;
                dt.AcceptChanges();
                return dt;
            }
        }



        /// <summary>
        /// PageList for DataReader
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="sql"></param>
        /// <param name="pageSize"></param>
        /// <param name="curPage"></param>
        /// <param name="pageCount"></param>
        /// <param name="count"></param>
        /// <param name="cmdParms"></param>
        /// <returns></returns>
        public List<T> PageListReader<T>(string connectionString, string sql, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms) where T : class, new()
        {
            int first = 0;
            int last = 0;
            int fieldCount = 0;
            List<T> itemlist = null;
            itemlist = new List<T>();
            T item = null;
            Type targettype = typeof(T);
            Type ptype = null;
            Object value = null;
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                SqlCommand cmd = conn.CreateCommand();
                PrepareCommand(cmd, conn, null, CommandType.Text, sql, cmdParms);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                fieldCount = reader.FieldCount;
                count = 0;
                first = (curPage - 1) * pageSize + 1;
                last = curPage * pageSize;
                List<KeyValuePair<string, int>> Columns = new List<KeyValuePair<string, int>>();
                for (int i = 0; i < fieldCount; i++)
                {

                    Columns.Add(new KeyValuePair<string, int>(reader.GetName(i).ToLower(), i));
                }
                KeyValuePair<string, int> columnName;
                while (reader.Read())
                {
                    count++;
                    if (count >= first && last >= count)
                    {
                        item = new T();
                        foreach (PropertyInfo pi in targettype.GetProperties())
                        {
                            columnName = Columns.Find(t => t.Key == pi.Name.ToLower());
                            if (pi.CanWrite && columnName.Value >= 0)
                            {
                                ptype = Type.GetType(pi.PropertyType.FullName);
                                value =  TypeExtensions.ChangeType(reader[columnName.Value], ptype);
                                pi.SetValue(item, value, null);
                            }
                        }
                        itemlist.Add(item);
                    }
                }
                reader.Close();
                if (pageSize != 0)
                    pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
                else
                    pageCount = 0;
                return itemlist;
            }
        }


        #endregion

        #region Other
        /// <summary>
        /// 得到数据条数
        /// </summary>
        public int GetCount(string connectionString, string tblName, string condition)
        {
            StringBuilder sql = new StringBuilder("select count(0) from " + tblName);
            if (!string.IsNullOrEmpty(condition))
                sql.Append(" where " + condition);

            object count = ExecuteScalar(connectionString, CommandType.Text, sql.ToString(), null);
            return int.Parse(count.ToString());
        }
        /// <summary>
        /// 生成要执行的命令
        /// </summary>
        private void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, CommandType cmdType,
            string cmdText, DbParameter[] cmdParms)
        {
            // 如果存在参数,则表示用户是用参数形式的SQL语句,可以替换
            //if (cmdParms != null && cmdParms.Length > 0)
            //    cmdText = cmdText.Replace("?", "@").Replace(":", "@");

            if (conn.State != ConnectionState.Open)

                conn.Open();

            cmd.Connection = conn;
            if (CommandType.Text == cmdType)
                cmd.CommandText = DBIsolationLevelSql.GetLevelSql(Config.IsolationLevel) + cmdText;
            else
                cmd.CommandText = cmdText;
            Config.ConsolePrintSql(this.GetType().Name, cmd.CommandText);
            cmd.CommandTimeout = 1800;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                {
                    if (parm.Value == null)
                        parm.Value = DBNull.Value;

                    parm.ParameterName = parm.ParameterName.Replace("?", "@").Replace(":", "@");
                    cmd.Parameters.Add(parm);
                }
            }
        }
        /// <summary>
        /// SqlBulkCopy 批量更新数据
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <param name="dataTable">数据集</param>
        /// <param name="crateTemplateSql">临时表创建字段</param>
        /// <param name="updateSql">更新语句</param>
        public void BulkUpdateData(string connectionString, DataTable dataTable, string crateTemplateSql, string updateSql)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                SqlTransaction tran = conn.BeginTransaction();
                using (var command = new SqlCommand("", conn, tran))
                {

                    try
                    {
                        //数据库并创建一个临时表来保存数据表的数据
                        command.CommandText = String.Format("  CREATE TABLE #TmpTable ({0})", crateTemplateSql);
                        command.ExecuteNonQuery();

                        //使用SqlBulkCopy 加载数据到临时表中
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
                        {
                            foreach (DataColumn dcPrepped in dataTable.Columns)
                            {
                                bulkCopy.ColumnMappings.Add(dcPrepped.ColumnName, dcPrepped.ColumnName);
                            }

                            bulkCopy.BulkCopyTimeout = 3600;
                            bulkCopy.DestinationTableName = "#TmpTable";
                            bulkCopy.WriteToServer(dataTable);
                            bulkCopy.Close();
                        }

                        // 执行Command命令 使用临时表的数据去更新目标表中的数据  然后删除临时表
                        command.CommandTimeout = 3600;
                        command.CommandText = updateSql;
                        command.ExecuteNonQuery();
                        if (tran != null)
                        {
                            tran.Commit();
                        }
                    }
                    catch (Exception ex)
                    {
                        if (tran != null)
                        {
                            tran.Rollback();
                        }
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
        }
        public void SqlBulkCopy(string connectionString, DataTable dt, string destinationTableName)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                SqlTransaction tran = conn.BeginTransaction();
                using (SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
                {

                    try
                    {
                        sbc.BulkCopyTimeout = 0;
                        sbc.DestinationTableName = destinationTableName;
                        sbc.WriteToServer(dt);
                        if (tran != null)
                        {
                            tran.Commit();
                        }

                    }
                    catch (Exception ex)
                    {
                        if (tran != null)
                        {
                            tran.Rollback();
                        }
                        throw ex;
                    }
                }
            }
        }
        public void SqlBulkCopy(DbTransaction trans, DataTable dt, string destinationTableName)
        {
            SqlConnection conn = trans.Connection as SqlConnection;
            SqlTransaction tran = trans as SqlTransaction;
            if (conn.State != ConnectionState.Open)
                conn.Open();
            using (SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
            {
                sbc.DestinationTableName = destinationTableName;
                sbc.WriteToServer(dt);
            }
        }
        public void SqlBulkCopy(DbTransaction trans, DataTable dt, string destinationTableName, string[] columns)
        {
            SqlConnection conn = trans.Connection as SqlConnection;
            SqlTransaction tran = trans as SqlTransaction;
            if (conn.State != ConnectionState.Open)
                conn.Open();
            using (SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
            {
                for (int i = 0; i < columns.Length; i++)
                {
                    sbc.ColumnMappings.Add(columns[i], columns[i]);
                }
                sbc.DestinationTableName = destinationTableName;
                sbc.WriteToServer(dt);
            }
        }
        public void SqlBulkCopy(DbTransaction trans, DataTable dt, string destinationTableName, string[,] columnMappings)
        {
            SqlConnection conn = trans.Connection as SqlConnection;
            SqlTransaction tran = trans as SqlTransaction;
            if (conn.State != ConnectionState.Open)
                conn.Open();
            using (SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
            {
                for (int i = 0; i < columnMappings.Length / 2; i++)
                {
                    sbc.ColumnMappings.Add(columnMappings[i, 0], columnMappings[i, 1]);
                }
                sbc.DestinationTableName = destinationTableName;
                sbc.WriteToServer(dt);
            }
        }
        public void SqlBulkCopy(string connectionString, DataTable dt, string destinationTableName, string[,] columnMappings)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                SqlTransaction tran = conn.BeginTransaction();
                using (SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.Default, tran))
                {

                    for (int i = 0; i < columnMappings.Length / 2; i++)
                    {
                        sbc.ColumnMappings.Add(columnMappings[i, 0], columnMappings[i, 1]);
                    }
                    sbc.DestinationTableName = destinationTableName;
                    try
                    {
                        sbc.WriteToServer(dt);
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }

                }
            }
        }



        #endregion


    }

    /// <summary>
    /// UDX日志辅助类(调用ILogger接口实现但遇到类代码为static时候勉强使用)
    /// </summary>
    public static class TypeExtensions
    {
        /// <summary>
        /// Convert.ChangeType doesnot support Nullable<>
        /// </summary>
        /// <param name="value"></param>
        /// <param name="conversionType"></param>
        /// <returns></returns>
        public static object ChangeType(this object value, Type conversionType)
        {
            try
            {
                if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
                {
                    if (value != null && value != System.DBNull.Value)
                    {
                        NullableConverter nullableConverter = new NullableConverter(conversionType);
                        conversionType = nullableConverter.UnderlyingType;
                        if (conversionType.IsEnum)
                        {
                            if (value is string)
                                return Enum.Parse(conversionType, value as string);
                            else
                                return Enum.ToObject(conversionType, value);
                        }
                        else
                        {
                            return Convert.ChangeType(value, conversionType);
                        }
                    }
                }

                if (value == null && conversionType.IsGenericType) return Activator.CreateInstance(conversionType);
                if (value == null) return null;
                if (conversionType == value.GetType()) return value;
                if (value.GetType().IsEnum && conversionType == typeof(string)) return value.ToString();
                if (conversionType.IsEnum)
                {
                    if (value is string)
                        return Enum.Parse(conversionType, value as string);
                    else
                        return Enum.ToObject(conversionType, value);
                }
                if (!conversionType.IsInterface && conversionType.IsGenericType)
                {
                    Type innerType = conversionType.GetGenericArguments()[0];
                    object innerValue = ChangeType(value, innerType);
                    return Activator.CreateInstance(conversionType, new object[] { innerValue });
                }
                if (value is string && conversionType == typeof(Guid)) return new Guid(value as string);
                if (value is string && conversionType == typeof(Version)) return new Version(value as string);
                if (!(value is IConvertible)) return value;
                return Convert.ChangeType(value, conversionType);
            }
            catch (Exception ex)
            {
              
                return null;
            }

        }
        /// <summary>
        /// 判断Guid是否为null或者Empty
        /// </summary>
        /// <param name="guid"></param>
        /// <returns></returns>
        public static bool IsNullOrEmpty(this Guid? guid)
        {
            return IsNullOrEmpty(guid ?? Guid.Empty);
        }

        /// <summary>
        /// 判断Guid是否为null或者Empty
        /// </summary>
        /// <param name="guid"></param>
        /// <returns></returns>
        public static bool IsNullOrEmpty(this Guid guid)
        {
            return guid == Guid.Empty;
        }
    }

    /// <summary>
    /// 枚举:数据库类型
    /// </summary>

    /// <summary>
    /// 数据库操作类型
    /// </summary>
    public class DBIsolationLevelSql
    {
        public const string ReadUncommittedSql = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;";
        public static string GetLevelSql(IsolationLevel level)
        {

            if (level == IsolationLevel.ReadUncommitted)
                return ReadUncommittedSql + System.Environment.NewLine;
            else
                return "";
        }
    }
    public class Config
    {
        public static bool PrintSql = true;
        public static IsolationLevel IsolationLevel = IsolationLevel.ReadUncommitted;
        public static void ConsolePrintSql(string objName, string sql)
        {

            if (!PrintSql) return;
            Console.WriteLine();
            Console.WriteLine($"{objName} CommandText {IsolationLevel}");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(sql);
            System.Diagnostics.Debug.WriteLine(sql);
            Console.ResetColor();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落叶@Henry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值