OracleBulkCopy 高效批量插入oracle

2 篇文章 0 订阅

OracleBulkCopy可以非常高效的直接将DataTable插入数据库,不需要写insert语句。

但遇到了2个关键问题:

1. 插入数据库的时候,会自动将表设置为主键失效,解决办法是先插入临时表,再将临时表拷贝至正式表。

具体OracleBulkCopy实现代码如下:

public static void TestInsert(DataTable dataTable)
        {
            try
            {
                using (OracleConnection conn = new OracleConnection(GlobalData.ConnectionStr))
                {
                    using (OracleCommand cmd = conn.CreateCommand())
                    {
                        conn.Open();

                        cmd.CommandText = "truncate table TESTTABLE_TEMP";
                        cmd.ExecuteNonQuery();

                        OracleBulkCopy bulkCopy = new OracleBulkCopy(GlobalData.ConnectionStr, OracleBulkCopyOptions.UseInternalTransaction);
                        bulkCopy.BulkCopyTimeout = 99999;
                        bulkCopy.DestinationTableName = "TESTTABLE_TEMP";    
                        bulkCopy.BatchSize = dataTable.Rows.Count;

                        foreach (DataColumn col in dataTable.Columns)
                        {
                            if (col.ColumnName.Trim() == "")
                            {
                                continue;
                            }
                            bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                        }

                        if (dataTable.Rows.Count != 0)
                        {
                            bulkCopy.WriteToServer(dataTable);

                            cmd.CommandType = CommandType.Text;
                            cmd.CommandText = "insert into TESTTABLE t (pk_sysuid,sales_id,price,occur_time) select sys_guid(),sales_id,price,occur_time from TESTTABLE_TEMP t1";
                            int result = cmd.ExecuteNonQuery();

                            cmd.CommandText = "truncate table TESTTABLE_TEMP";
                            cmd.ExecuteNonQuery();
                        }

                        conn.Close();
                        bulkCopy.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

2. DataTable中DateTime格式的数据,需要转换成Oracle的Date类型,否则会报{"参数绑定无效\r\n参数名: System.DateTime"}。但DataTable的自动列转换类型的表达式不支持.Net Framework以外的类型(官网说明:https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=netframework-4.8#System_Data_DataColumn_Expression),所以只能自己添加列,新建为OracleDate类型,再将原DateTime类的那一列删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值