xml地图|网站地图|网站标签 [设为首页] [加入收藏]

类批量复制数据到数据库

来源:http://www.ccidsi.com 作者:集成介绍 人气:161 发布时间:2019-05-19
摘要:眼下集团要求优化导入的难题,由于事先使用的章程是生成 Insert语句插入数据库,数据量小的时候基本上能用,可是随着发展数据量慢慢大了,以前的方式质量就跟不上了,于是开采了

眼下集团要求优化导入的难题,由于事先使用的章程是生成 Insert 语句插入数据库,数据量小的时候基本上能用,可是随着发展数据量慢慢大了,以前的方式质量就跟不上了,于是开采了 SqlBulkCopy 这么些类。

C# 使用 SqlBulkCopy 类批量复制数据到数据库,

新近厂家索要优化导入的主题素材,由于以前使用的措施是生成 Insert 语句插入数据库,数据量小的时候还不错,可是随着进步数据量稳步大了,在此之前的方法质量就跟不上了,于是发掘了 SqlBulkCopy 那几个类。

利用 SqlBulkCopy 类只可以向 SQL Server 表写入数据。可是,数据源不限于 SQL Server;能够运用别的数据源,只要数据可加载到 DataTable 实例或可应用 IDataReader 实例读取数据。

public class Conn
    {
        private static string StrConn
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["StrConn"].ToString();
                //return ConfigurationManager.AppSettings["StrConn"].ToString();
            }
        }

        public static SqlConnection SqlConn
        {
            get
            {
                return new SqlConnection(StrConn);
            }
        }
    }

      public class SqlHelper
    {

        public DataTable GetDataTable(string sql)
        {
            DataTable dt = new DataTable();
            SqlConnection conn = null;
            SqlDataAdapter sda = null;
            try
            {
                conn = Conn.SqlConn;
                sda = new SqlDataAdapter(sql, conn);
                conn.Open();
                sda.Fill(dt);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                if (sda != null)
                {
                    sda.Dispose();
                }
            }
            return dt;
        }

        public DataSet GetDataSet(string sql)
        {
            DataSet ds = new DataSet();
            SqlConnection conn = null;
            SqlDataAdapter sda = null;
            try
            {
                conn = Conn.SqlConn;
                sda = new SqlDataAdapter(sql, conn);
                conn.Open();
                sda.Fill(ds);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                if (sda != null)
                {
                    sda.Dispose();
                }
            }
            return ds;
        }


        /// <summary>
        /// 使用事务插入方法
        /// </summary>
        /// <param name="dt">源数据</param>
        /// <param name="tableName">目标表名</param>
        public void InsertO(DataTable dt, string tableName)
        {
            using (SqlConnection conn = Conn.SqlConn)
            {
                using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.Default | SqlBulkCopyOptions.UseInternalTransaction))
                {
                    try
                    {
                        //设置目标表名,即数据库表名
                        sqlBuleCopy.DestinationTableName = tableName;

                        //设置每一批次的行数,即达到指定的行数就插入一次数据库
                        sqlBuleCopy.BatchSize = 100000;

                        //设置超时之前完成的时间(秒)
                        sqlBuleCopy.BulkCopyTimeout = 3600;
                        for (int i = 0; i < dt.Columns.Count; i  )
                        {
                            //设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列
                            sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlBuleCopy.WriteToServer(dt);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }

        /// <summary>
        /// 未使用事务插入方法
        /// </summary>
        /// <param name="dt">源数据</param>
        /// <param name="tableName">目标表名</param>
        public void InsertT(DataTable dt, string tableName)
        {
            using (SqlConnection conn = Conn.SqlConn)
            {
                using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn))
                {
                    try
                    {
                        conn.Open();
                        //设置目标表名,即数据库表名
                        sqlBuleCopy.DestinationTableName = tableName;

                        //设置每一批次的行数,即达到指定的行数就插入一次数据库
                        sqlBuleCopy.BatchSize = 100000;

                        //设置超时之前完成的时间(秒)
                        sqlBuleCopy.BulkCopyTimeout = 3600;
                        for (int i = 0; i < dt.Columns.Count; i  )
                        {
                            //设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列
                            sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlBuleCopy.WriteToServer(dt);
                    }
                    catch (Exception)
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                    finally
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                }
            }
        }
    }

自己的源数据是运用 Excel 导入的多少,导入的措施就背着了,不是这里的要紧,之后作者会特意总计一下 Excel 导入的不二秘技。然后查询指标表供给插入数据的字段,修改源数据表的字段名和种类,然后调用批量布置的法子。

protected void btnImport_Click(object sender, EventArgs e)
        {
            try
            {
                //获取导入的数据
                DataSet ds = BI.ExecleDs(savePath, "");
                if (ds != null && ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];

                    //查询目标表需要插入的字段
                    string sql = " select U_No,U_Name,U_Pwd,P_Id from UserInfo ";
                    DataTable dt1 = sqlhelper.GetDataTable(sql);

                    if (dt1 != null)
                    {
                        for (int i = 0; i < dt1.Columns.Count; i  )
                        {
                            //修改源数据表的字段类型和字段名称
                            dt.Columns[i].DataType = dt1.Columns[i].DataType;
                            dt.Columns[i].ColumnMapping = dt1.Columns[i].ColumnMapping;
                            dt.Columns[i].ColumnName = dt1.Columns[i].ColumnName;
                        }

                        sqlhelper.InsertO(dt, "UserInfo");
                    }
                }
            }
            catch (Exception ex)
            {

                throw;
            }
        }

假设源数据表的列和目的表的列的逐壹或列名不等同,那就非得选取ColumnMappings.Add() 方法设置映射关系。

参考:

 

使用 SqlBulkCopy 类批量复制数据到数据库, 近期厂商需求优化导入的主题材料,由于在此以前运用的法子是生成 Insert 语句插入数据库,数据量小的...

选取 SqlBulkCopy 类只可以向 SQL Server 表写入数据。但是,数据源不防止 SQL Server;能够应用其它数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

public class Conn
    {
        private static string StrConn
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["StrConn"].ToString();
                //return ConfigurationManager.AppSettings["StrConn"].ToString();
            }
        }

        public static SqlConnection SqlConn
        {
            get
            {
                return new SqlConnection(StrConn);
            }
        }
    }

      public class SqlHelper
    {

        public DataTable GetDataTable(string sql)
        {
            DataTable dt = new DataTable();
            SqlConnection conn = null;
            SqlDataAdapter sda = null;
            try
            {
                conn = Conn.SqlConn;
                sda = new SqlDataAdapter(sql, conn);
                conn.Open();
                sda.Fill(dt);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                if (sda != null)
                {
                    sda.Dispose();
                }
            }
            return dt;
        }

        public DataSet GetDataSet(string sql)
        {
            DataSet ds = new DataSet();
            SqlConnection conn = null;
            SqlDataAdapter sda = null;
            try
            {
                conn = Conn.SqlConn;
                sda = new SqlDataAdapter(sql, conn);
                conn.Open();
                sda.Fill(ds);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                if (sda != null)
                {
                    sda.Dispose();
                }
            }
            return ds;
        }


        /// <summary>
        /// 使用事务插入方法
        /// </summary>
        /// <param name="dt">源数据</param>
        /// <param name="tableName">目标表名</param>
        public void InsertO(DataTable dt, string tableName)
        {
            using (SqlConnection conn = Conn.SqlConn)
            {
                using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.Default | SqlBulkCopyOptions.UseInternalTransaction))
                {
                    try
                    {
                        //设置目标表名,即数据库表名
                        sqlBuleCopy.DestinationTableName = tableName;

                        //设置每一批次的行数,即达到指定的行数就插入一次数据库
                        sqlBuleCopy.BatchSize = 100000;

                        //设置超时之前完成的时间(秒)
                        sqlBuleCopy.BulkCopyTimeout = 3600;
                        for (int i = 0; i < dt.Columns.Count; i  )
                        {
                            //设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列
                            sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlBuleCopy.WriteToServer(dt);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }

        /// <summary>
        /// 未使用事务插入方法
        /// </summary>
        /// <param name="dt">源数据</param>
        /// <param name="tableName">目标表名</param>
        public void InsertT(DataTable dt, string tableName)
        {
            using (SqlConnection conn = Conn.SqlConn)
            {
                using (SqlBulkCopy sqlBuleCopy = new SqlBulkCopy(conn))
                {
                    try
                    {
                        conn.Open();
                        //设置目标表名,即数据库表名
                        sqlBuleCopy.DestinationTableName = tableName;

                        //设置每一批次的行数,即达到指定的行数就插入一次数据库
                        sqlBuleCopy.BatchSize = 100000;

                        //设置超时之前完成的时间(秒)
                        sqlBuleCopy.BulkCopyTimeout = 3600;
                        for (int i = 0; i < dt.Columns.Count; i  )
                        {
                            //设置源数据列与目标表的列的映射关系,第一个参数为源数据列,第二个参数为目标表列
                            sqlBuleCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlBuleCopy.WriteToServer(dt);
                    }
                    catch (Exception)
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                    finally
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                }
            }
        }
    }

自己的源数据是运用 Excel 导入的多少,导入的点子就不说了,不是这里的最主要,之后笔者会特地计算一下 Excel 导入的秘籍。然后查询目的表需求插入数据的字段,修改源数据表的字段名和种类,然后调用批量插入的措施。

protected void btnImport_Click(object sender, EventArgs e)
        {
            try
            {
                //获取导入的数据
                DataSet ds = BI.ExecleDs(savePath, "");
                if (ds != null && ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];

                    //查询目标表需要插入的字段
                    string sql = " select U_No,U_Name,U_Pwd,P_Id from UserInfo ";
                    DataTable dt1 = sqlhelper.GetDataTable(sql);

                    if (dt1 != null)
                    {
                        for (int i = 0; i < dt1.Columns.Count; i  )
                        {
                            //修改源数据表的字段类型和字段名称
                            dt.Columns[i].DataType = dt1.Columns[i].DataType;
                            dt.Columns[i].ColumnMapping = dt1.Columns[i].ColumnMapping;
                            dt.Columns[i].ColumnName = dt1.Columns[i].ColumnName;
                        }

                        sqlhelper.InsertO(dt, "UserInfo");
                    }
                }
            }
            catch (Exception ex)
            {

                throw;
            }
        }

上述这种修改数据类型的法子,要是遇上数据类型不一致并且 DataTable 有数量的时候,会报错,不可能改改有多少的列的数据类型。(好像是废话,嘿嘿,未有数量和有数量时不可能改改数据类型,那统统是没用的。)

本文由68399皇家赌场发布于集成介绍,转载请注明出处:类批量复制数据到数据库

关键词: 68399皇家赌场

上一篇:语法学习总结,ES6新特征数字

下一篇:没有了

最火资讯