一次性要插入1000条数据怎么效率最高啊?

时间:2021-06-19 23:24:39
本来打算吧1000条SQL拼成一条一起执行的,貌似数据量多了有点问题..
有啥其他办法吗?

 public static int ExecuteNonQuery2(string strSql)
        {
            using (OracleConnection connection = new OracleConnection(LocalDb2))
            {
                using (OracleCommand cmd = new OracleCommand(strSql, connection))
                {
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.OracleClient.OracleException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }
SQL拼接完后执行这个
string bbb='insert into ......'估计有1000条
OracleHelper.ExecuteNonQuery2(bbb);
麻烦大家帮忙下

32 个解决方案

#1


事务 一次性要插入1000条数据怎么效率最高啊?

#2


把这1000条数据分为50条一组,然后做20次事物,根据你服务器的配置,尽量做带毫秒级。

#3


如果你的1000条数据都是现成的sql语句并且拼接到了一起了string bbb='insert into ......'估计有1000条
那就直接插入 搞什么事务啊 都是坑 

#4


DataAdapter.Update

#5


google blukcopy

#6


一次性要插入1000条数据怎么效率最高啊?
不知道呢,为什么要在

#7


就看你插入的值是什么?肯定有高效的办法

#8


批量插入,该类应实现 Sql是System.Data.SqlClient.SqlBulkCopy ,Oracle 也有对应的类

#9


引用 8 楼 ycg_893 的回复:
批量插入,该类应实现 Sql是System.Data.SqlClient.SqlBulkCopy ,Oracle 也有对应的类

+1

#10


拼一条sql语句
insert into table1(id,c1)
select 1,'aaa1' union all
select 2,'aaa1' union all
select 3,'aaa1' union all
...
select 1000,'aaa1' 
提交一次

#11


用 blukcopy,

#12


先插到临时表,然后再转移过去

#13


如果是2008 也可以先定义表类型,然后作为参数插入;

#14


八楼正解,我也做过这样同样的程序,但是oracle中有些类型字段用这个不行。

#15


不懂嘿,来学习的

#16


请问什么界面操作,会连续插入1000条数据,费解!

#17


SqlBulkCopy 插入大量数据非常快, 比逐条插入快几十倍.

要插入的数据放进 DataTable dt 中

                connection.Open();
                using (SqlBulkCopy sqlBC = new SqlBulkCopy(connection))
                {
                    //一次批量的插入的数据量
                    sqlBC.BatchSize = dt.Rows.Count;
                    //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                    sqlBC.BulkCopyTimeout = 600;

                    //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
                    //sqlBC.NotifyAfter = 10000;
                    //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

                    //设置要批量写入的表
                    sqlBC.DestinationTableName = 表名;

                    //自定义的datatable和数据库的字段进行对应
                    sqlBC.ColumnMappings.Add("字段", "字段");

                    //批量写入
                    if (dt.Rows.Count != 0 && dt != null)
                    {
                        sqlBC.WriteToServer(dt);
                        dt.Dispose();
                    }

                }

#18


高潮了 oh~~no~~

#19


使用存储过程

#20


同意 blukcopy

#21


SqlBulkCopy > 事物

#22


在这里留个记号  方便后面学习

#23


http://bbs.csdn.net/topics/360222649

#24


一句  sql语句搞定:
Insert Into TRUCK(TruckCode,TruckName,TruckType,IcardNo,TruckCap,OperateTime)Select VEHICLE_LICENSE,TOOL_NUMBER,ATTRIBUTE3,ATTRIBUTE2,WEIGHT_MAX,LAST_UPDATE_DATE From CUX_9_FRTC_FREIGHT_TOOLS_DEF_V    这是我之前做的项目,不用解释吧,希望你有帮助

#25


引用 5 楼 caozhy 的回复:
google blukcopy
你的编程是从哪里学的???

#26


大量数据用SqlBulkCopy ,上万条记录入库

#27


引用 5 楼 caozhy 的回复:
google blukcopy

Oracle不支持也没有SqlBulkCopy类,那个只有SqlServer数据库才支持,Oracle可以用数组形式的参数批量提交来实现,但那个绝对不能叫“BulkCopy”。
OracleCommand command = new OracleCommand("链接字符串"); 
command.ArrayBindCount = 1000;
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
int[] deptNo = new int[1000]; 
string[] dname = new string[1000]; 
string[] loc = new string[1000];
command.Parameters.Add(new OracleParameter("deptno", OracleDbType.Int32) { Value = deptNo });
command.Parameters.Add(new OracleParameter("dname", OracleDbType.Varchar2) { Value = dname });
command.Parameters.Add(new OracleParameter("loc", OracleDbType.Varchar2) { Value = loc });
command.ExecuteNonQuery();
 

#28


引用 27 楼 qldsrx 的回复:
Quote: 引用 5 楼 caozhy 的回复:

google blukcopy

Oracle不支持也没有SqlBulkCopy类,那个只有SqlServer数据库才支持,Oracle可以用数组形式的参数批量提交来实现,但那个绝对不能叫“BulkCopy”。
OracleCommand command = new OracleCommand("链接字符串"); 
command.ArrayBindCount = 1000;
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
int[] deptNo = new int[1000]; 
string[] dname = new string[1000]; 
string[] loc = new string[1000];
command.Parameters.Add(new OracleParameter("deptno", OracleDbType.Int32) { Value = deptNo });
command.Parameters.Add(new OracleParameter("dname", OracleDbType.Varchar2) { Value = dname });
command.Parameters.Add(new OracleParameter("loc", OracleDbType.Varchar2) { Value = loc });
command.ExecuteNonQuery();
 


怎么没有?Oracle.DataAccess.Client.OracleBulkCopy

#29


一次性要插入1000条数据怎么效率最高啊?
insert tab col value,value1,value2,value3...value999

#30


http://www.cnblogs.com/Seabiscuit/archive/2010/05/25/1743341.html

看看这个是否帮得上忙

#31


SqlBulkCopy

#32


引用 17 楼 gzw13999 的回复:
SqlBulkCopy 插入大量数据非常快, 比逐条插入快几十倍.

要插入的数据放进 DataTable dt 中

                connection.Open();
                using (SqlBulkCopy sqlBC = new SqlBulkCopy(connection))
                {
                    //一次批量的插入的数据量
                    sqlBC.BatchSize = dt.Rows.Count;
                    //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                    sqlBC.BulkCopyTimeout = 600;

                    //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
                    //sqlBC.NotifyAfter = 10000;
                    //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

                    //设置要批量写入的表
                    sqlBC.DestinationTableName = 表名;

                    //自定义的datatable和数据库的字段进行对应
                    sqlBC.ColumnMappings.Add("字段", "字段");

                    //批量写入
                    if (dt.Rows.Count != 0 && dt != null)
                    {
                        sqlBC.WriteToServer(dt);
                        dt.Dispose();
                    }

                }

+1

#1


事务 一次性要插入1000条数据怎么效率最高啊?

#2


把这1000条数据分为50条一组,然后做20次事物,根据你服务器的配置,尽量做带毫秒级。

#3


如果你的1000条数据都是现成的sql语句并且拼接到了一起了string bbb='insert into ......'估计有1000条
那就直接插入 搞什么事务啊 都是坑 

#4


DataAdapter.Update

#5


google blukcopy

#6


一次性要插入1000条数据怎么效率最高啊?
不知道呢,为什么要在

#7


就看你插入的值是什么?肯定有高效的办法

#8


批量插入,该类应实现 Sql是System.Data.SqlClient.SqlBulkCopy ,Oracle 也有对应的类

#9


引用 8 楼 ycg_893 的回复:
批量插入,该类应实现 Sql是System.Data.SqlClient.SqlBulkCopy ,Oracle 也有对应的类

+1

#10


拼一条sql语句
insert into table1(id,c1)
select 1,'aaa1' union all
select 2,'aaa1' union all
select 3,'aaa1' union all
...
select 1000,'aaa1' 
提交一次

#11


用 blukcopy,

#12


先插到临时表,然后再转移过去

#13


如果是2008 也可以先定义表类型,然后作为参数插入;

#14


八楼正解,我也做过这样同样的程序,但是oracle中有些类型字段用这个不行。

#15


不懂嘿,来学习的

#16


请问什么界面操作,会连续插入1000条数据,费解!

#17


SqlBulkCopy 插入大量数据非常快, 比逐条插入快几十倍.

要插入的数据放进 DataTable dt 中

                connection.Open();
                using (SqlBulkCopy sqlBC = new SqlBulkCopy(connection))
                {
                    //一次批量的插入的数据量
                    sqlBC.BatchSize = dt.Rows.Count;
                    //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                    sqlBC.BulkCopyTimeout = 600;

                    //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
                    //sqlBC.NotifyAfter = 10000;
                    //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

                    //设置要批量写入的表
                    sqlBC.DestinationTableName = 表名;

                    //自定义的datatable和数据库的字段进行对应
                    sqlBC.ColumnMappings.Add("字段", "字段");

                    //批量写入
                    if (dt.Rows.Count != 0 && dt != null)
                    {
                        sqlBC.WriteToServer(dt);
                        dt.Dispose();
                    }

                }

#18


高潮了 oh~~no~~

#19


使用存储过程

#20


同意 blukcopy

#21


SqlBulkCopy > 事物

#22


在这里留个记号  方便后面学习

#23


http://bbs.csdn.net/topics/360222649

#24


一句  sql语句搞定:
Insert Into TRUCK(TruckCode,TruckName,TruckType,IcardNo,TruckCap,OperateTime)Select VEHICLE_LICENSE,TOOL_NUMBER,ATTRIBUTE3,ATTRIBUTE2,WEIGHT_MAX,LAST_UPDATE_DATE From CUX_9_FRTC_FREIGHT_TOOLS_DEF_V    这是我之前做的项目,不用解释吧,希望你有帮助

#25


引用 5 楼 caozhy 的回复:
google blukcopy
你的编程是从哪里学的???

#26


大量数据用SqlBulkCopy ,上万条记录入库

#27


引用 5 楼 caozhy 的回复:
google blukcopy

Oracle不支持也没有SqlBulkCopy类,那个只有SqlServer数据库才支持,Oracle可以用数组形式的参数批量提交来实现,但那个绝对不能叫“BulkCopy”。
OracleCommand command = new OracleCommand("链接字符串"); 
command.ArrayBindCount = 1000;
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
int[] deptNo = new int[1000]; 
string[] dname = new string[1000]; 
string[] loc = new string[1000];
command.Parameters.Add(new OracleParameter("deptno", OracleDbType.Int32) { Value = deptNo });
command.Parameters.Add(new OracleParameter("dname", OracleDbType.Varchar2) { Value = dname });
command.Parameters.Add(new OracleParameter("loc", OracleDbType.Varchar2) { Value = loc });
command.ExecuteNonQuery();
 

#28


引用 27 楼 qldsrx 的回复:
Quote: 引用 5 楼 caozhy 的回复:

google blukcopy

Oracle不支持也没有SqlBulkCopy类,那个只有SqlServer数据库才支持,Oracle可以用数组形式的参数批量提交来实现,但那个绝对不能叫“BulkCopy”。
OracleCommand command = new OracleCommand("链接字符串"); 
command.ArrayBindCount = 1000;
command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";
int[] deptNo = new int[1000]; 
string[] dname = new string[1000]; 
string[] loc = new string[1000];
command.Parameters.Add(new OracleParameter("deptno", OracleDbType.Int32) { Value = deptNo });
command.Parameters.Add(new OracleParameter("dname", OracleDbType.Varchar2) { Value = dname });
command.Parameters.Add(new OracleParameter("loc", OracleDbType.Varchar2) { Value = loc });
command.ExecuteNonQuery();
 


怎么没有?Oracle.DataAccess.Client.OracleBulkCopy

#29


一次性要插入1000条数据怎么效率最高啊?
insert tab col value,value1,value2,value3...value999

#30


http://www.cnblogs.com/Seabiscuit/archive/2010/05/25/1743341.html

看看这个是否帮得上忙

#31


SqlBulkCopy

#32


引用 17 楼 gzw13999 的回复:
SqlBulkCopy 插入大量数据非常快, 比逐条插入快几十倍.

要插入的数据放进 DataTable dt 中

                connection.Open();
                using (SqlBulkCopy sqlBC = new SqlBulkCopy(connection))
                {
                    //一次批量的插入的数据量
                    sqlBC.BatchSize = dt.Rows.Count;
                    //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                    sqlBC.BulkCopyTimeout = 600;

                    //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
                    //sqlBC.NotifyAfter = 10000;
                    //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

                    //设置要批量写入的表
                    sqlBC.DestinationTableName = 表名;

                    //自定义的datatable和数据库的字段进行对应
                    sqlBC.ColumnMappings.Add("字段", "字段");

                    //批量写入
                    if (dt.Rows.Count != 0 && dt != null)
                    {
                        sqlBC.WriteToServer(dt);
                        dt.Dispose();
                    }

                }

+1