SqlHelper

整理了一份sqlhelper类,包含增删改查和批量添加和修改方法

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;

namespace MyTest.Data
{
    public class SqllHelper
    {
        //=================================执行sql和存储过程===========================

        public static Object SqlScalar(string connectString, string sql)
        {
            return SqlScalar(connectString, sql, 1);
        }
        public static Object SqlScalar(string connectString, string sql, object parms)
        {
            return SqlScalar(connectString, sql, parms, 1);
        }
        public static int SqlExecute(string connectString, string sql)
        {
            return SqlExecute(connectString, sql, 1);
        }
        public static int SqlExecute(string connectString, string sql, object parms)
        {
            return SqlExecute(connectString, sql, parms, 1);
        }
        public static T SqlSingle<T>(string connectString, string sql)
        {
            return SqlSingle<T>(connectString, sql, 1);
        }
        public static T SqlSingle<T>(string connectString, string sql, object parms)
        {
            return SqlSingle<T>(connectString, sql, parms, 1);
        }
        public static List<T> SqlList<T>(string connectString, string sql)
        {
            return SqlList<T>(connectString, sql, 1);
        }
        public static List<T> SqlList<T>(string connectString, string sql, object parms)
        {
            return SqlList<T>(connectString, sql, parms, 1);
        }
        public static DataTable SqlDataTable(string connectString, string sql)
        {
            return SqlDataTable(connectString, sql, 1);
        }
        public static DataTable SqlDataTable(string connectString, string sql, object parms)
        {
            return SqlDataTable(connectString, sql, parms, 1);
        }



        public static Object ProScalar(string connectString, string proName)
        {
            return SqlScalar(connectString, proName, 4);
        }
        public static Object ProScalar(string connectString, string proName, object parms)
        {
            return SqlScalar(connectString, proName, parms, 4);
        }
        public static int ProExecute(string connectString, string proName)
        {
            return SqlExecute(connectString, proName, 4);
        }
        public static int ProExecute(string connectString, string proName, object parms)
        {
            return SqlExecute(connectString, proName, parms, 4);
        }
        public static T ProSingle<T>(string connectString, string proName)
        {
            return SqlSingle<T>(connectString, proName, 4);
        }
        public static T ProSingle<T>(string connectString, string proName, object parms)
        {
            return SqlSingle<T>(connectString, proName, parms, 4);
        }
        public static List<T> ProList<T>(string connectString, string proName)
        {
            return SqlList<T>(connectString, proName, 4);
        }
        public static List<T> ProList<T>(string connectString, string proName, object parms)
        {
            return SqlList<T>(connectString, proName, parms, 4);
        }
        public static DataTable ProDataTable(string connectString, string sql)
        {
            return SqlDataTable(connectString, sql, 4);
        }
        public static DataTable ProDataTable(string connectString, string sql, object parms)
        {
            return SqlDataTable(connectString, sql, parms, 4);
        }

        public static void BatchInsert(string connectString, DataTable dt, string tableName)
        {
            BatchInsertImpl(connectString, dt, tableName);
        }
        public static void BatchInsert<T>(string connectString, List<T> list, string tableName)
        {
            DataTable dt = GetBatchInsertDataTable(connectString, list, tableName);
            BatchInsertImpl(connectString, dt, tableName);
        }

        /// <summary>
        /// 批量修改,使用了事务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connectString">数据库连接字符串</param>
        /// <param name="list">要修改的数据集</param>
        /// <param name="tableName">要修改表名</param>
        /// <param name="primaryKeyName">修改时的条件字段,一般修改是按照主键修改的比较多</param>
        /// <param name="columns">要修改的字段名称,
        /// 如果为空则把T类型中的除primaryKeyName属性之外的所有属性和数据库字段对应进行修改,
        /// 属性名称和数据库字段对应时不区分大小写</param>
        /// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
        /// <returns>影响数据库的条数</returns>
        public static int BatchUpdate<T>(string connectString, List<T> list, string tableName, string primaryKeyName,string[] columns=null, int onceNum = 100)
        {
            if (list == null || list.Count == 0) return 0;
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            if (propertys == null || propertys.Length == 0) return 0;
            PropertyInfo wherep = propertys.Where(s => s.Name.ToLower() == primaryKeyName.ToLower()).ToArray()[0]; //拼接修改条件
            List<PropertyInfo> propertys_update = new List<PropertyInfo>();
            if (columns==null|| columns.Length==0)
            {
                //指定修改字段为空时,默认修改实体中除了条件属性外的其他所有属性对应的字段
                propertys_update = propertys.Where(s => s.Name.ToLower() != primaryKeyName.ToLower()).ToList(); 
            }
            else
            {
                string[] columnsLower = string.Join(",", columns).ToLower().Split(',');
                foreach (var item in propertys)
                {
                    if (columnsLower.Contains(item.Name.ToLower())&& item.Name.ToLower()!=primaryKeyName.ToLower())
                    {
                        propertys_update.Add(item);
                    }
                }
            }
            int i = 0;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {

                    using (SqlCommand cmd = new SqlCommand(sqlBuiler.ToString(), conn, tran))
                    {
                        foreach (T row in list)
                        {
                            i++;
                            sqlBuiler.Append($" update {tableName} Set ");
                            for (int j = 0; j < propertys_update.Count; j++)
                            {
                                if (j == propertys_update.Count - 1)
                                {
                                    sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i} ");
                                }
                                else
                                {
                                    sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i},");
                                }
                                cmd.Parameters.Add(new SqlParameter("@" + propertys_update[j].Name + "_" + i, propertys_update[j].GetValue(row)));
                            }
                            sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
                            cmd.Parameters.Add(new SqlParameter("@" + primaryKeyName + "_" + i, wherep.GetValue(row)));
                            if (i % onceNum == 0 || i == list.Count)
                            {
                                //执行sql
                                cmd.CommandText = sqlBuiler.ToString();
                                obj += cmd.ExecuteNonQuery();
                                sqlBuiler.Clear();
                                cmd.Parameters.Clear();
                            }
                        }
                    }
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw;
                }
            }
            return obj;
        }
        /// <summary>
        /// 批量修改,使用了事务
        /// </summary>
        /// <param name="connectString">数据库连接字符串</param>
        /// <param name="dt">要修改的数据源</param>
        /// <param name="tableName">要修改的表名</param>
        /// <param name="primaryKeyName">修改时的条件字段,一般是按照主键修改比较多</param>
        /// <param name="columns">要修改的字段名称
        /// 如果为空则把dt中所有列和数据表字段对应,修改除条件列外的所有列,
        /// 列明和数据库字段对应时不区分大小写</param>
        /// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
        /// <returns></returns>
        public static int BatchUpdate(string connectString, DataTable dt, string tableName, string primaryKeyName, string[] columns = null, int onceNum = 100)
        {
            if (dt == null || dt.Rows == null || dt.Rows.Count == 0) return 0;
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            List<string> ufilds = new List<string>(); //所有要修改的字段
            DataColumnCollection coll = dt.Columns;
            string whereName = primaryKeyName;
            string[] columnsLower = null;
            if (columns!=null&& columns.Length>0)
            {
                columnsLower = string.Join(",", columns).ToLower().Split(',');
            }
           
            foreach (DataColumn item in coll)
            {
                if (item.ColumnName.ToLower() != primaryKeyName.ToLower())
                {
                    if (columnsLower!=null&& columnsLower.Length>0)
                    {
                        if (columnsLower.Contains(item.ColumnName.ToLower()))
                        {
                            ufilds.Add(item.ColumnName);
                        }
                    }
                    else
                    {
                        ufilds.Add(item.ColumnName);
                    }
                }
                else
                {
                    whereName = item.ColumnName;
                }
            }
            if (ufilds == null || ufilds.Count == 0)
            {
                return 0;
            }
            int i = 0;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {
                    using (SqlCommand cmd = new SqlCommand(sqlBuiler.ToString(), conn, tran))
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            i++;
                            sqlBuiler.Append($" update {tableName} Set ");
                            for (int j = 0; j < ufilds.Count; j++)
                            {
                                if (j == ufilds.Count - 1)
                                {
                                    sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i} ");
                                }
                                else
                                {
                                    sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i},");
                                }
                                cmd.Parameters.Add(new SqlParameter("@" + ufilds[j] + "_" + i, row[ufilds[j]]));
                            }
                            sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
                            cmd.Parameters.Add(new SqlParameter("@" + primaryKeyName + "_" + i, row[whereName]));
                            if (i % onceNum == 0 || i == dt.Rows.Count)
                            {
                                cmd.CommandText = sqlBuiler.ToString();
                                obj += cmd.ExecuteNonQuery();
                                sqlBuiler.Clear();
                                cmd.Parameters.Clear();
                            }
                        }
                    }
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw;
                }

            }
            return obj;
        }

        //==========================方法实现================================

        #region SqlScalar

        /// <summary>
        /// 返回查询结果的第一行第一列
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">sql语句,或者存储过程名称</param>
        /// <param name="commandType">sql语句</param>
        /// <returns></returns>
        private static Object SqlScalar(string connectString, string sql, int commandType = 1)
        {
            object obj = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    obj = cmd.ExecuteScalar();
                }
            }
            return obj;
        }
        /// <summary>
        /// 返回查询结果的第一行第一列
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">sql语句</param>
        /// <param name="parms">参数</param>
        /// <returns></returns>
        private static Object SqlScalar(string connectString, string sql, object parms, int commandType = 1)
        {
            List<SqlParameter> parmList = GetSqlCommandParams(parms);
            object obj = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }

        #endregion

        #region SqlExecute
        /// <summary>
        /// 返回影响数据库的条数
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static int SqlExecute(string connectString, string sql, int commandType = 1)
        {
            int obj = 0;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    obj = cmd.ExecuteNonQuery();
                }
            }
            return obj;
        }

        private static int SqlExecute(string connectString, string sql, object parms, int commandType = 1)
        {
            List<SqlParameter> parmList = GetSqlCommandParams(parms);
            int obj = 0;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    obj = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }
        #endregion

        #region SqlSingle
        /// <summary>
        /// 返回查询结果的第一行
        /// </summary>
        /// <typeparam name="T">要返回的类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static T SqlSingle<T>(string connectString, string sql, int commandType = 1)
        {
            T obj = default(T);
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            return obj;
        }


        private static T SqlSingle<T>(string connectString, string sql, object parms, int commandType = 1)
        {
            List<SqlParameter> parmList = GetSqlCommandParams(parms);
            T obj = default(T);
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                break;
                            }
                        }
                    }
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }
        #endregion

        #region SqlList
        /// <summary>
        /// 返回列表集合
        /// </summary>
        /// <typeparam name="T">要返回的对象类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static List<T> SqlList<T>(string connectString, string sql, int commandType = 1)
        {
            List<T> list = new List<T>();
            Type t = typeof(T);
            Assembly ass = t.Assembly;

            PropertyInfo p = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                T obj = default(T);
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                list.Add(obj);
                            }

                        }

                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 返回列表集合
        /// </summary>
        /// <typeparam name="T">要返回的对象类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <param name="parms">sql中用到的参数</param>
        /// <returns></returns>
        private static List<T> SqlList<T>(string connectString, string sql, object parms, int commandType = 1)
        {
            List<SqlParameter> parmList = GetSqlCommandParams(parms);
            List<T> list = new List<T>();
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                T obj = default(T);
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                list.Add(obj);
                            }

                        }
                    }
                    cmd.Parameters.Clear();
                }
            }
            return list;
        }
        #endregion

        #region SqlDataTable
        private static DataTable SqlDataTable(string connectString, string sql, int commandType = 1)
        {
            DataTable dt = null;
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
            }
            if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];
            }
            return dt;
        }
        private static DataTable SqlDataTable(string connectString, string sql, object parms, int commandType = 1)
        {
            List<SqlParameter> parmList = GetSqlCommandParams(parms);
            DataTable dt = null;
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
            }
            if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];
            }
            return dt;
        } 
        #endregion

        #region BatchInsert
        /// <summary>
        /// 批插入
        /// </summary>
        /// <param name="connectString"></param>
        /// <param name="tableName"></param>
        /// <param name="dt">数据源的各列名称必须和数据表保持一致才行,且区分大小写</param>
        private static void BatchInsertImpl(string connectString, DataTable dt, string tableName)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
                {
                    bulkcopy.DestinationTableName = tableName;
                    bulkcopy.BatchSize = dt.Rows.Count;
                    foreach (DataColumn item in dt.Columns)
                    {
                        //设置要插入的字段映射,映射了哪个插入哪个,而且区分大小写
                        bulkcopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(item.ColumnName, item.ColumnName));
                    }
                    conn.Open();
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        bulkcopy.WriteToServer(dt);
                    }
                }
                long time = watch.ElapsedMilliseconds;
            }
        }


        #endregion


        #region GetSqlCommandParams
        /// <summary>
        /// 获取sqlcommand参数
        /// </summary>
        /// <param name="parms"></param>
        /// <returns></returns>
        private static List<SqlParameter> GetSqlCommandParams(object parms)
        {
            List<SqlParameter> parmList = null;
            PropertyInfo[] propertys = parms.GetType().GetProperties();
            if (propertys != null && propertys.Length > 0)
            {
                parmList = new List<SqlParameter>();
                foreach (var item in propertys)
                {
                    if (!item.CanRead)
                    {
                        continue;
                    }
                    parmList.Add(new SqlParameter("@" + item.Name, item.GetValue(parms)));
                }
            }
            return parmList;
        }
        #endregion

        #region GetFiles
        /// <summary>
        /// 获取泛型中的类型属性和数据库datareder中的属性共有部分
        /// </summary>
        /// <typeparam name="T">要返回的类型</typeparam>
        /// <param name="reader">SqlDataReader</param>
        /// <returns></returns>
        private static Dictionary<string, PropertyInfo> GetFiles<T>(SqlDataReader reader)
        {
            Dictionary<string, PropertyInfo> result = new Dictionary<string, PropertyInfo>();
            int cloumFiles = reader == null ? 0 : reader.FieldCount;
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            if (propertys != null && cloumFiles > 0)
            {
                List<string> readerFilesList = new List<string>(); //存储当前reader中的所有列名称
                for (int i = 0; i < cloumFiles; i++)
                {
                    readerFilesList.Add(reader.GetName(i).ToLower());
                }
                //取reder中和T类型中都有属性
                List<PropertyInfo> resultList = propertys.Where(s => s.CanRead && readerFilesList.Contains(s.Name.ToLower())).ToList();
                if (resultList != null && resultList.Count > 0)
                {
                    foreach (var item in resultList)
                    {
                        result.Add(item.Name, item);
                    }
                }
            }
            return result;
        }
        #endregion

        #region ChangeType
        /// <summary>
        /// 将数据库中查询出来的值转化为T类型中想要的类型,这样避免直接赋值object类型装箱时的性能消耗
        /// </summary>
        /// <param name="value">数据库中查出来的value值</param>
        /// <param name="type">要转化的类型</param>
        /// <returns></returns>
        private static object ChangeType(object value, Type type)
        {
            if (type.FullName == typeof(string).FullName)
            {
                return Convert.ChangeType(Convert.IsDBNull(value) ? null : value, type);
            }
            if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                NullableConverter convertor = new NullableConverter(type);
                return Convert.IsDBNull(value) ? null : convertor.ConvertFrom(value);
            }
            return Convert.IsDBNull(value) ? null : value;
        }
        #endregion

        #region GetBatchInsertDataTable

        private static DataTable GetBatchInsertDataTable<T>(string connectString, List<T> list, string tableName)
        {
            string[] columns = null;
            List<SpColumnsEntity> addafter = new List<SpColumnsEntity>();
            List<SpColumnsEntity> columns_table = ProList<SpColumnsEntity>(connectString, "sp_columns", new { table_name = tableName });
            if (columns_table == null || columns_table.Count == 0) return null;
            columns = columns_table.Select(s => s.Column_Name).ToArray();
            if (columns == null || columns.Length == 0) return null;
            DataTable dt = new DataTable();
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            foreach (var item in propertys)
            {
                string[] c_table_list = columns.Where(s => s.ToUpper() == item.Name.ToUpper()).ToArray();
                if (c_table_list != null && c_table_list.Length > 0)
                {
                    dt.Columns.Add(c_table_list[0]);
                }
            }
            foreach (var item in list)
            {
                ArrayList tempList = new ArrayList();
                foreach (var p in propertys)
                {
                    string[] c_table_list = columns.Where(s => s.ToUpper() == p.Name.ToUpper()).ToArray();
                    if (c_table_list != null && c_table_list.Length > 0)
                    {
                        object obj = p.GetValue(item);
                        tempList.Add(obj);
                    }
                }
                dt.LoadDataRow(tempList.ToArray(), true);
            }
            return dt;
        }
        #endregion

    }



    public class SpColumnsEntity
    {
        /// <summary>
        /// 列名
        /// </summary>
        public string Column_Name { set; get; }
        /// <summary>
        /// 列对应的位置
        /// </summary>

        public int Ordinal_Position { set; get; }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值