c#SqlBulkCopy starts things to operate, and the tool class encapsulated by SqlDataReaderTools

1. SqlBulkCopy transaction operation

//事务创建:创建一个开始事务的数据库连接
            SqlDataReaderTools sdrtTran = new SqlDataReaderTools();
            sdrtTran.CreateConAndOpenTran(@"配置的sqlserver数据库连接");
            try
            {
				delTime_q = delTime_z.AddDays(-delDay);
				//清空表
				string sqlDel = "delete from aaa where Time between '{0}' and '{1}'";
				object[] parmaters = { delTime_q.ToShortDateString().ToString(), delTime_z.ToShortDateString().ToString() };
				sqlDel = String.Format(sqlDel, parmaters);
				//事务1:执行删除数据


                IList<BBModel> list = new List<BBModel>();

                SqlDataReaderTools sdrtSearch = new SqlDataReaderTools();
                sdrtSearch.CreateConAndOpen(@"配置的sqlserver数据库连接");

                for (int i = 0; i < synDay; i++)
                {
                    searchTime_q = searchTime_z.AddDays(-i);

                    string sql = @"SELECT * from BB ";

                    IList<BBModel> listTemp = sdrtSearch.ExecuteToList<BBModel>(sql);
                    if (listTemp != null)
                    {
                        list = list.Concat(listTemp).ToList();
                    }
                }
                sdrtSearch.DisposeCon();

                //事务2:执行数据插入
                sdrtTran.BulkInsertTran<BBModel>("表名", list);

                //事务提交:销毁连接
                sdrtTran.DisposeConAndCommitTran();
                response.Content = new StringContent("成功");
            }
            catch (Exception e)
            {   //发生异常事务回滚:销毁连接
                sdrtTran.DisposeConAndRollbackTran();
                response.Content = new StringContent("删除或写入**表失败,失败原因:" + e.Message);
            }

Tool content

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Web;

namespace DoTask.Common
{
    public class SqlDataReaderTools
    {
        private SqlConnection cn;
        private SqlTransaction tran;
        /// <summary>
        /// 方法1:根据配置创建1个连接,并打开
        /// </summary>
        /// <param name="dataBaseName"></param>
        /// <returns></returns>
        public SqlConnection CreateConAndOpen(string dataBaseName) {
            
            cn = new SqlConnection();
            cn.ConnectionString = ConfigurationManager.ConnectionStrings[dataBaseName].ConnectionString;
            cn.Open();
            return cn;
        }
        /// <summary>
        /// 方法2:根据配置仅创建1个连接
        /// </summary>
        /// <param name="dataBaseName"></param>
        /// <returns></returns>
        public SqlConnection CreateCon(string dataBaseName)
        {
            
            cn = new SqlConnection();
            cn.ConnectionString = ConfigurationManager.ConnectionStrings[dataBaseName].ConnectionString;
            return cn;
        }
        /// <summary>
        /// 方法3:创建一个开始事务的连接
        /// </summary>
        /// <param name="dataBaseName"></param>
        /// <returns></returns>
        public SqlConnection CreateConAndOpenTran(string dataBaseName)
        {
            
            cn = new SqlConnection();
            cn.ConnectionString = ConfigurationManager.ConnectionStrings[dataBaseName].ConnectionString;
            cn.Open();
            tran = cn.BeginTransaction();
            return cn;
        }
        /// <summary>
        /// 方法4:打开该连接
        /// </summary>
        public void OpenCon()
        {
            cn.Open();
        }
        /// <summary>
        /// 方法5:关闭该连接
        /// </summary>
        public void CloseCon()
        {
            cn.Close();
        }
        /// <summary>
        /// 方法6:关闭连接并提交事务
        /// </summary>
        public void CloseConAndCommitTran()
        {
            tran.Commit();
            cn.Close();
        }
        /// <summary>
        /// 方法7:关闭连接回滚事务
        /// </summary>
        public void CloseConAndRollbackTran()
        {
            tran.Rollback();
            cn.Close();
        }
        /// <summary>
        /// 方法8:销毁连接提交事务
        /// </summary>
        public void DisposeCon()
        {
            cn.Dispose();
        }
        public void DisposeConAndCommitTran()
        {
            tran.Commit();
            cn.Dispose();
        }
        /// <summary>
        /// 方法9销毁连接回滚事务
        /// </summary>
        public void DisposeConAndRollbackTran()
        {
            tran.Rollback();
            cn.Dispose();
        }
        /// <summary>
        /// 方法10:执行sql查询(不开始事务)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns>返回SqlDataReader</returns>
        public SqlDataReader ExecuteReader(string sql)
        {
            SqlDataReader dr;
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = cn;
                cmd.CommandText = sql;
                dr = cmd.ExecuteReader();
            }
            return dr;
        }



        /// <summary>
        /// 方法11:判断SqlDataReader是否存在某列
        /// </summary>
        /// <param name="dr">SqlDataReader</param>
        /// <param name="columnName">列名</param>
        /// <returns></returns>
        private bool readerExists(SqlDataReader dr, string columnName)
        {

            dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" + columnName + "'";

            return (dr.GetSchemaTable().DefaultView.Count > 0);

        }

        ///<summary>
        ///方法12:利用反射和泛型将SqlDataReader转换成List模型
        ///</summary>
        ///<param name="sql">查询sql语句</param>
        ///<returns></returns>

        public IList<T> ExecuteToList<T>(string sql) where T : new()

        {
            IList<T> list;

            Type type = typeof(T);

            string tempName = string.Empty;

            using (SqlDataReader reader = ExecuteReader(sql))
            {
                if (reader.HasRows)
                {
                    list = new List<T>();
                    while (reader.Read())
                    {
                        T t = new T();

                        PropertyInfo[] propertys = t.GetType().GetProperties();

                        foreach (PropertyInfo pi in propertys)
                        {
                            tempName = pi.Name;

                            if (readerExists(reader, tempName))
                            {
                                if (!pi.CanWrite)
                                {
                                    continue;
                                }
                                var value = reader[tempName];

                                if (value != DBNull.Value)
                                {
                                    pi.SetValue(t, value, null);
                                }

                            }

                        }

                        list.Add(t);

                    }
                    return list;
                }
            }
            return null;
        }

        /// <summary>
        /// 方法13:批量往表插入数据(不使用始事务)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connection">ConfigurationManager.ConnectionStrings["BPMDATA"].ConnectionString</param>
        /// <param name="tableName"></param>
        /// <param name="list">插入数据的List集合</param>
        /// <returns></returns>
        public string BulkInsert<T>(string connection, string tableName, IList<T> list)
        {
            try
            {
                using (var bulkCopy = new SqlBulkCopy(connection))
                {
                    bulkCopy.BatchSize = list.Count;
                    bulkCopy.DestinationTableName = tableName;

                    var table = new DataTable();
                    var props = TypeDescriptor.GetProperties(typeof(T))
                                               .Cast<PropertyDescriptor>()
                                               .Where(propertyInfo => propertyInfo.PropertyType != null
                                                    && propertyInfo.PropertyType.Namespace != null
                                                    && propertyInfo.PropertyType.Namespace.Equals("System"))
                                               .ToArray();

                    foreach (var propertyInfo in props)
                    {
                        System.Diagnostics.Debug.WriteLine("列:" + propertyInfo.Name);
                        bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                        table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
                    }

                    var values = new object[props.Length];
                    foreach (var item in list)
                    {
                        for (var i = 0; i < values.Length; i++)
                        {
                            values[i] = props[i].GetValue(item);
                        }

                        table.Rows.Add(values);
                    }

                    bulkCopy.WriteToServer(table);
                }
                return "ok";
            }
            catch (Exception ee)
            {
                return ee.Message;
            }
        }

        /// <summary>
        ///方法14:批量往表插入数据(使用事务)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connection">ConfigurationManager.ConnectionStrings["BPMDATA"].ConnectionString</param>
        /// <param name="tableName"></param>
        /// <param name="list"></param>
        /// <returns></returns>
        public void BulkInsertTran<T>(string tableName, IList<T> list)
        {
                using (var bulkCopy = new SqlBulkCopy(cn, SqlBulkCopyOptions.Default, tran))
                {
                    bulkCopy.BatchSize = list.Count;
                    bulkCopy.DestinationTableName = tableName;

                    var table = new DataTable();
                    var props = TypeDescriptor.GetProperties(typeof(T))
                                               .Cast<PropertyDescriptor>()
                                               .Where(propertyInfo => propertyInfo.PropertyType != null
                                                    && propertyInfo.PropertyType.Namespace != null
                                                    && propertyInfo.PropertyType.Namespace.Equals("System"))
                                               .ToArray();

                    foreach (var propertyInfo in props)
                    {
                        System.Diagnostics.Debug.WriteLine("列:" + propertyInfo.Name);
                        bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                        table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
                    }

                    var values = new object[props.Length];
                    foreach (var item in list)
                    {
                        for (var i = 0; i < values.Length; i++)
                        {
                            values[i] = props[i].GetValue(item);
                        }

                        table.Rows.Add(values);
                    }

                    bulkCopy.WriteToServer(table);
                }
        }
        /// <summary>
        /// 方法15:执行无返回值的操作(delete,insert,update),使用事务
        /// </summary>
        /// <param name="sql"></param>
        public void ExecuteNonQueryTran(string sql)
        {
           
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            cmd.CommandText = sql;
            cmd.Transaction = tran;
            cmd.ExecuteNonQuery();

        }

    }
}

 

Guess you like

Origin blog.csdn.net/qq_26408545/article/details/93914744