public static class SqlConnectionExtension
    {
        /// <summary>
        /// 使用 SqlBulkCopy 向 destinationTableName 表插入数据
        /// </summary>
        /// <typeparam name="TModel">必须拥有与目标表所有字段对应属性</typeparam>
        /// <param name="conn">连接字符串</param>
        /// <param name="modelList">要插入的数据</param>
        /// <param name="batchSize">SqlBulkCopy.BatchSize</param>
        /// <param name="destinationTableName">表名</param>        
        public static int BulkCopy<TModel>(string connstr, List<TModel> list, int batchSize, string destinationTableName)
        {
            var table = new DataTable();

            var type = typeof(TModel);
            int rValue = 0;
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                SqlCommand cmd = new SqlCommand("select * from [" + destinationTableName + "] where 1=2", conn);

                // 执行
                conn.Open();
                var reader = cmd.ExecuteReader();
                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, null) ?? DBNull.Value;
                    }
                    table.Rows.Add(row);
                }
                reader.Close();

                SqlBulkCopy bulkCopy = new SqlBulkCopy(conn as SqlConnection);
                bulkCopy.DestinationTableName = destinationTableName;
                bulkCopy.BatchSize = batchSize;

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

                    var dataReader = table.CreateDataReader();

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

            return rValue;
        }
    }

  

 posted on 2023-03-28 17:27  Michael.li  阅读(29)  评论(0编辑  收藏  举报