利用Bulk Insert将Excel中的大批量数据入库

原创,转载请注明出处。
小弟摸索了二天,终于搞定,不敢独享。

第一次使用微软的SqlBulkCopy,其实它也是调用Bulk insert的,只不过微软封装了它,不过它不能指定映射文件,常出错,会说类型不匹配。一咬牙决定自己动手做。以下是具体的操作:

第一步:使用Bcp工具先生成一个XML格式化文档,它能映射欲插入的数据与数据库的表的对应关系。有关Bcp工具的使用请在CMD中键入Bcp /?。

    在CMD中敲入命令:
bcp  数据库名.表名 format nul -c -x -f  生成文档的路径   -T 。 先存为:dataformat.xml。
 如果你不想自己敲,我已经写好C#代码:
 //author:MeBack_黯然消魂

/// <summary>
        /// 创建BulkInsert,XML格式化文件
        /// </summary>
        /// <param name="server">服务器名</param>
        /// <param name="user">用户名</param>
        /// <param name="pwd">密码</param>
        /// <param name="dataBaseName">数据库名</param>
        /// <param name="tableName">表名</param>
        /// <param name="xmlFormatFilePath">输入文件的路径</param>
        /// <returns>Boolern</returns>
        public static bool BuildBulkInsertXMLFile(string server, string user, string pwd, string dataBaseName, string tableName, string xmlFormatFilePath)
        {
            string cmd = null;
            cmd = string.Format("bcp {0}..{1} format nul -c -x -f \"{2}\" -S \"{3}\" -U \"{4}\" -P \"{5}\"", dataBaseName, tableName, xmlFormatFilePath, server, user, pwd);
            TextReader tr = null;
            TextWriter tw = null;
            bool IsSuccess = false;
            try
            {
                Unity.RunCommand(cmd);
                IsSuccess = File.Exists(xmlFormatFilePath);
                tr = new StreamReader(xmlFormatFilePath, Encoding.GetEncoding("gb2312"));
                cmd = tr.ReadToEnd();
                cmd = cmd.Replace("=\"\\t\"", "=\",\"");/*分隔符默认为\t 容易出错,我们用逗号分开,当然这只是例子,用一种少见的字符作分隔符,比如韩国日本的字符。就不会出错了*/
                tr.Close();
                tr.Dispose();
                tw = new StreamWriter(xmlFormatFilePath, false, Encoding.GetEncoding("gb2312"));
                tw.Write(cmd);
                tw.Close();
                tw.Dispose();
                return IsSuccess && cmd.Length > 0;
            }
            catch (Exception)
            {
                if (tw != null)
                    tw.Dispose();
                if (tr != null)
                    tr.Dispose();
                cmd = null;
                return IsSuccess;
            }


        }

/// <summary>
        /// 执行CMD命令
        /// </summary>
        /// <param name="sCommand"></param>
        /// <returns></returns>
        public static bool RunCommand(string sCommand)
        {
          //调用系统CMD,篇幅有限这部分代码不用写了,如果需要我补上,
        
}



第二步:将Excel的数据读入写到一个文件
          因为Bulk插入的数据格式写CVS类似,所以我们自定义将它写给我们的dataformat.xml格式,
          
       

 /// <summary>
        /// 创建BulkInsert的数据文件
        /// </summary>
        /// <param name="dt">欲写值的表</param>
        /// <param name="dataPath">储存的路径</param>
        /// <returns>Boolern</returns>
        public static bool BuildBulkDataFile(DataTable dt, string dataPath)
        {
            TextWriter tw = null;

            try
            {
                if (null != dt)
                    return false;
                else if (dt.Rows.Count < 1)
                {
                    return false;
                }
                else
                {
                    tw = new StreamWriter(dataPath, false, Encoding.GetEncoding("gb2312"));
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        for (int c = 0; c < dt.Columns.Count; c++)
                        {
                            if (c == 0)
                                tw.Write(dt.Rows[i][c]);
                            else
                                tw.Write("," + dt.Rows[i][c]);
                            tw.Flush();

                        }
                        tw.Write(tw.NewLine);
                        tw.Flush();
                    }
                    tw.Flush();
                    tw.Close();
                    tw.Dispose();
                }

                return File.Exists(dataPath);

            }
            catch (Exception)
            {
                if (tw != null)
                {
                    tw.Dispose();
                }
                return false;
            }

 


        }

OK,现在我们有格式文件与数据文件,就可以调用Bulk Insert命令了
第三步:
           
/// <summary>
        /// BulkInsert插入大批量数据
        /// </summary>
        /// <param name="dataBaseName">数据库名</param>
        /// <param name="insertTableName">欲插入的表名</param>
        /// <param name="xmlFormatFilePath">表的XMl格式化文件</param>
        /// <param name="dataFilePath">数据文件</param>
        /// <returns>Boolern</returns>
        public static bool DataTranByBulkInsert(string dataBaseName, string insertTableName, string xmlFormatFilePath, string dataFilePath)
        {
            return SqlHelper.ExecuteSql(string.Format("BULK INSERT {0}..{1} FROM '{2}' with(FORMATFILE='{3}')", dataBaseName, insertTableName, dataFilePath, xmlFormatFilePath)) > 0; //SqlHelper为数据操作类,就这执行这条Sql语句,
        }

OK,大功告成,据Microsoft称,Bulk Insert插入几万条数据就几秒钟,经测试一万条数据花了5秒。

注意:Web服务器与SqlServer必须在同一机器上,如不在同一机器,须设共享文件夹解决。

转载于:https://www.cnblogs.com/MeBack/archive/2007/10/31/944478.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: eff bulk insert(大规模批量插入)是一种高效的数据插入方法,特别适用于需要批量插入大量数据的场景。它的主要特点是通过一次性插入多条记录,减少了数据库的访问次数和网络传输时间,从而提高了插入数据的效率。 使用eff bulk insert可以显著减少数据插入的时间和资源消耗。与传统的逐条插入方式相比,它可以减少对数据库的频繁访问,从而减少了插入数据的时间。使用eff bulk insert还可以减少网络传输时间,因为一次性插入多条记录可以通过一次网络传输完成。 在使用eff bulk insert时,需要准备一个数据集,该数据集包含要插入的多条记录。可以使用CSV文件、Excel文件或其他数据格式来存储这些记录。然后,通过使用数据库提供的API或工具,将数据集一次性插入到数据库。 使用eff bulk insert需要考虑一些因素。首先,需要确保数据集的准确性和完整性,因为一次性插入可能会导致无法恢复的数据损失。其次,需要根据数据库的要求和限制来调整数据集的大小,以避免超出数据库的容量或性能限制。最后,需要根据实际情况考虑使用并发处理等优化技术,以进一步提高插入数据的效率。 总之,eff bulk insert是一种高效的数据插入方法,可以显著提高大规模批量插入数据的效率。通过一次性插入多条记录,减少了对数据库的频繁访问和网络传输时间,从而节省了时间和资源消耗。使用eff bulk insert需要注意数据集的准确性和完整性,调整数据集的大小,并根据需要使用优化技术。 ### 回答2: Ef BulkInsert是Entity Framework (EF) 提供的一种用于批量插入数据的方法。在传统的插入操作,每次向数据库插入一条记录都需要与数据库建立连接、执行插入操作、关闭连接等一系列操作,这样的方式效率较低。 而Ef BulkInsert可以通过一次性提交多条数据数据库,大大提高了插入数据的效率。它采用批量操作的方式,将多条数据一次性插入到数据库,减少了连接和关闭连接的次数,提高了数据库操作的性能。 使用Ef BulkInsert的步骤如下: 1. 首先,我们需要安装Entity Framework库并引入相关命名空间。 2. 创建EF的DbContext对象,该对象用于和数据库进行交互。 3. 在DbContext对象,使用BulkInsert方法,将要插入的数据一次性提交到数据库。 4. 执行BulkInsert操作后,数据将被批量插入到数据库。 需要注意的是,Ef BulkInsert对于大批量数据插入非常有效,但在小规模的插入任务,效果可能不如预期。此外,由于批量操作会占用较多的系统资源,因此需要根据具体情况进行合理的调整和使用。 总之,Ef BulkInsert是一种通过批量插入数据的方式来提高插入性能的方法,可以有效减少连接和关闭连接的次数,对于大批量数据插入任务非常实用。 ### 回答3: EF BulkInsert 是 Entity Framework (EF) 的一个功能,用于批量插入数据数据库。传统的方法是通过循环遍历每个实体对象并逐个插入到数据库,这种方式效率较低,尤其是当需要插入大量数据时。 而 EF BulkInsert 则通过内置的高效批量插入算法,能够在一次操作将多个实体对象一次性插入到数据库,从而极大地提高了插入数据的速度和效率。 使用 EF BulkInsert 主要包括以下几个步骤: 1. 首先,需要通过 NuGet 包管理器安装 EF BulkInsert 插件。 2. 创建实体对象的列表,将需要插入的数据存储在这个列表。 3. 调用 EF BulkInsert 插件提供的 API,将实体对象列表作为参数传入,表示将这些实体对象批量插入到数据库。 4. 执行插入操作后,EF BulkInsert 会自动处理数据库的连接和事务,确保数据的一致性和完整性。 5. 最后,可以根据返回的结果来判断插入是否成功,并进行相应的处理。 EF BulkInsert 在插入大量数据时能够极大地提升性能,减少了循环插入的时间消耗,同时还避免了频繁的数据库连接和事务开启的开销。 需要注意的是,EF BulkInsert 不适用于所有情况,特别是在需要进行复杂数据处理或者需要触发数据库的相关事件时,仍然需要使用传统的逐个插入方式。 总之,EF BulkInsert 是一个高效的批量插入数据的工具,可以在处理大量数据时显著提升性能,提供了更好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值