.Net插入大批量数据

 1、 使用SqlDataAdapter

/// <summary>
        /// 实现数据库事务,大批量新增数据
        /// </summary>
        /// <param name="dt">数据源</param>
        public static int ExecuteSqlTran(DataTable dt)
        {
            int affectRows = 0;
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand())
                {
                    SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
                    try
                    {
                        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();

string insertcmd = @"
                                        DECLARE @Count INT;
                                        SELECT @Count = COUNT(*) FROM {0} WHERE {3};
                                        IF(@Count = 0)
                                        INSERT INTO {0} ({1}) VALUES ({2})";

StringBuilder columns = new StringBuilder();
                        StringBuilder filters = new StringBuilder();
                        StringBuilder paramvalues = new StringBuilder();

foreach (DataColumn dc in dt.Columns)
                        {
                            columns.Append(dc.ColumnName + ",");
                            paramvalues.Append("@" + dc.ColumnName + ",");
                            filters.AppendFormat(" {0} = @{0} AND ", dc.ColumnName);
                            SqlParameter par = new SqlParameter();
                            par.ParameterName = "@" + dc.ColumnName;
                            par.SourceColumn = dc.ColumnName;
                            command.Parameters.Add(par);
                        }
                        string column = columns.ToString().Substring(0, columns.ToString().LastIndexOf(‘,‘));
                        string paramvalue = paramvalues.ToString().Substring(0, paramvalues.ToString().LastIndexOf(‘,‘));
                        string filter = filters.ToString().Substring(0, filters.ToString().LastIndexOf("AND"));
                        command.CommandText = string.Format(insertcmd, dt.TableName, column, paramvalue, filter);
                        command.Connection = connection;
                        command.Transaction = transaction;
                        sqlDataAdapter.InsertCommand = command;

affectRows = sqlDataAdapter.Update(dt);

transaction.Commit();
                        connection.Close();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw;
                    }
                    finally
                    {
                        command.Dispose();
                        connection.Close();
                    }
                }
            }
            return affectRows;
        }

时间: 2024-10-24 16:10:51

.Net插入大批量数据的相关文章

SQL 数据库连续插入大批量数据时超时

经常会处理大批量千万级的数据,一直以来都没问题.最近在处理时确出来了经常超时,程序跑一段时间就得停下来重启服务器,根据几次的调整发现了问题的所在,产生这类问题主要是以下几点所导致: 1.数据库连接未关闭,大量操作数据库时,连接未关闭的话,会导致连接过多数据库卡死. 2.检查数据库的超时时间设置过短. 3.索引:数据库操作期间太多的索引导致产生很多碎片,清理和重新组织了下索引 . 4.日志文件过大数据的操作时处理日志超时导致,删除或是压缩日志,把日志文件的增长降低. 现在这种问题基本上是第3.4两

插入大批量数据的脚本

1 declare 2 totalrow integer := 1; 3 begin 4 while totalrow <= 100000 loop 5 insert into _THE_TEST ("TESTID","ENTITYID","ELEMENTTYPE","ID","ACTION","RESULTTYPE","RESULT","ERRORD

jdbc批量插入实现大批量数据快速插入

今天在做一个将excel数据导入数据库的程序时,由于数据量大,准备采用jdbc的批量插入.于是用了preparedStatement.addBatch();当加入1w条数据时,再执行插入操作,preparedStatement.executeBatch().我原以为这样会很快,结果插入65536条数据一共花30多分钟,完全出乎我的意料.于是问了一下同事,他们在处理这种大批量数据导入的时候是如何处理的,发现他们也是用的jdbc批量插入处理,但与我不同是:他们使用了con.setAutoCommit

MYSQL 大批量数据插入

最近在做MYSQL大批量数据的测试,就简单总结一下遇到的问题: 首先我是简单的写了一个MYSQL的循环插入数据的SP,具体如下: 这是插入100W数据的过程和结果,可以看到是换了55min +20S约3320秒(约300rows/s),看到之后我是只崩溃,就在网上查了些提速的方法: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似): 1. 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at

MySQL大批量数据插入,PHP之for不断插入时出现缓慢的解决方案及优化(转载)

公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上.目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标. 到MySQL官方网站查了查资料,发现MySQL支持在一条INSERT语句中插入多条记录,格式如下: INSERT table_name (column1, column2, ..., columnN) VALUES (rec1_val1, rec1_val2, ..., rec1_val

数据库插入或者更新大批量数据的性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1.一条SQL语句插入多条数据 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUE

java大批量数据导入(MySQL)

? 版权声明:本文为博主原创文章,转载请注明出处 最近同事碰到大批量数据导入问题,因此也关注了一下.大批量数据导入主要存在两点问题:内存溢出和导入速率慢. 内存溢出:将文件中的数据全部取出放在集合中,当数据过多时就出现Java内存溢出,此时可通过调大JVM的最大可用内存(Xmx)解决, 但终究不是王道.    MySQL支持一条SQL语句插入多条记录的操作,并且效率比单条插入快的不是一点点:但是MySQL一次可接受的数据包大小 也是有限制的,当一次插入过多时也可能造成数据包内存溢出,此时可通过调

postgresql大批量数据导入方法

一直没有好好关注这个功能,昨天看了一下,数据库插入有瓶颈,今天研究了一下: 主要有以下方案: 1.使用copy从文件导入: copy table_001(a, b, "f", d, c, "e") from 'd:/data1.txt' (delimiter ','); 速度极快: 不带索引: 查询成功: 共计 69971 行受到影响,耗时: 4351 毫秒(ms).        查询成功: 共计 69971 行受到影响,耗时: 4971 毫秒(ms).     

ODP方式,大批量数据写入ORACLE数据库

项目中在同步数据的时候,需要把获得的数据DataTable,写入oracle数据库 因为System.Data.OracleClient写入方式写入大批量数据特别慢,改用Oracle.DataAccess写入方式(上代码): ODP工具类: 需要引入命名空间: using Oracle.DataAccess;using Oracle.DataAccess.Client;using Oracle.DataAccess.Types; 1 ODP_Inserter 2 { 3 /// <summary