C#SqlBulkCopy

 //效率,dapper add list 8000条 40秒,它只要1秒多
        public static int SqlBulkCopy<T>(this DbConnection conn, List<T> list) where T : Key
        {
            var type = typeof(T);
            var isClose = conn.IsNull();
            conn = ConnInit(conn, list.FirstOrDefault().Key);

            var table = new DataTable();
            var reader = conn.ExecuteReader($"select * from [{type.Name}] where 1=2");
            table.Load(reader);


            foreach (var item in list)
            {
                var row = table.NewRow();
                foreach (DataColumn column in table.Columns)
                {
                    row[column] = type.GetProperty(column.ColumnName)?.GetValue(item) ?? DBNull.Value;
                }
                table.Rows.Add(row);
            }


            SqlBulkCopy bulkCopy = new SqlBulkCopy(conn as SqlConnection);
            bulkCopy.DestinationTableName = type.Name;
            bulkCopy.BatchSize = table.Rows.Count;

            try
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                var dataReader = table.CreateDataReader();

                if (table != null && table.Rows.Count != 0)
                    bulkCopy.WriteToServer(dataReader);
            }
            catch (Exception ex)
            {
                conn?.Close();
                throw ex;
            }
            finally
            {
                if (isClose)
                {
                    conn?.Close();
                }
                if (bulkCopy != null)
                    bulkCopy.Close();
            }
            return table.Rows.Count;
        }

 

posted @ 2021-11-12 16:17  212的s  阅读(677)  评论(0)    收藏  举报