C# Oracle批量插入数据进度条的实现代码

前言

由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中。考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。

批量插入

项目中运用的是System.Data.OracleClient。首先将Excel数据通过转换函数转换为DataTable,其中的字段和数据库中相应表格的字段完全对应。

public int Import2Oracle(ISheet sheet, string tablename)
{
  DataTable dt = GetDataFromExcelByNPOI(sheet); //经过转换后获得DataTable
  OracleCommand cmd = conn.CreateCommand();// conn为数据库连接对象
  OracleDataAdapter da = new OracleDataAdapter(cmd);
  OracleCommandBuilder ocb = new OracleCommandBuilder(da);
  string SelectSQL = "select * from "+tablename+ " where ROWNUM=0";
  da.SelectCommand.CommandText = SelectSQL;
  da.InsertCommand = ocb.GetInsertCommand();
  da.Update(dt);
  return 1; //返回正常
}

上述代码没有列出连接Oracle数据库相关代码,该段代码将DataTable批量插入数据库中。为了利用进度条控件实现显示插入的进度,需要在每次成功插入一条数据后更新进度条。

进度条实现

为了实现实时更新插入进度,需要用到OracleDataAdapter类下RowUpdated事件。官方文档中有注释,当使用Update方法时,在每一条记录更新时会发生两个事件,即OnRowUpdating和OnRowUpdated。利用OnRowUpdated这个事件即可记录已插入多少条数据,显示插入进度。

int Sum = 0; //总记录数
int rowNum = 0; //插入记录数
public int Import2Oracle(ISheet sheet)
{
  Sum = sheet.LastRowNum - 1; //获取总记录数
  DataTable dt = GetDataFromExcelByNPOI(sheet); //经过转换后获得DataTable,利用到了NPOI
  OracleCommand cmd = conn.CreateCommand();// conn为数据库连接对象
  OracleDataAdapter da = new OracleDataAdapter(cmd);
  OracleCommandBuilder ocb = new OracleCommandBuilder(da);
  string SelectSQL = "select * from GZGDZL."+tablename+ " where ROWNUM=0";
  da.SelectCommand.CommandText = SelectSQL;
  da.InsertCommand = ocb.GetInsertCommand();

  // update, this operation fires two events
  // (RowUpdating/RowUpdated) per changed row
  //这里只用到RowUpdated事件
  da.RowUpdated += new OracleRowUpdatedEventHandler(OnRowUpdated);

  da.Update(dt);
  return 1; //返回正常
}
//OnRowUpdated事件
 private void OnRowUpdated(object sender, OracleRowUpdatedEventArgs e)
{
  //刷新界面进度条
  rowNum = rowNum + 1;
  reportValue = (int)(rowNum /m_sheet.LastRowNum * 100);
  this.progressBar1.Value = percent; //progressBar控件已经设置最大值为100,最小值为0
}

经过改进后以上代码即可让用户实时看到数据插入进度,虽然在一定程度上会影响插入的效率,但换来了用户对插入状态的了解,而且这种影响在数据量不是特别巨大的情况下几乎可以忽略。

总结

以上所述是小编给大家介绍的C# Oracle批量插入数据进度条的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • C#自定义音乐播放器进度条
  • C#实现带百分比的进度条功能示例
  • C#实现带进度条的ListView
  • C# Winform下载文件并显示进度条的实现代码
  • c#根据文件大小显示文件复制进度条实例
  • c#进度条 progressBar 使用方法的小例子
  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
  • C#中常使用进度条的代码
(0)

相关推荐

  • C#实现带百分比的进度条功能示例

    本文实例讲述了C#实现带百分比的进度条功能.分享给大家供大家参考,具体如下: 功能需求: 如果程序中会执行一个耗时的计算过程,我想在用户点击按钮后,弹出一个进度条窗口,显示正在执行的进度(最好能带有百分比),执行完成后,进度条窗口关闭,回到主程序窗口. 在关闭子窗口之前父窗体不能点击操作. 实现方法: 先设计Form2进度条窗体,在Form2中央上放ProgressBar控件progressBar1和Label控件label1,代码: public partial class Form2 : F

  • C# Winform下载文件并显示进度条的实现代码

    方法一: 效果如下图所示: 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinShowDown { public partial class F

  • c#根据文件大小显示文件复制进度条实例

    初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉.这里记录下,以防以后用到这方面的知识点. 窗体设计: code: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.

  • C#自定义音乐播放器进度条

    有些时候我们做的程序需要进度条,而vs提供的控件不是我们想要的.先看效果图: 进度条闪烁动画,当然背景可设为Transparent 之前想手绘进度条线条的,结果控件运行时会闪烁,所以直接用了panel控件 源码: [DefaultEvent("ProgressClick")] [ToolboxBitmap(typeof(TrackBar))] public partial class ProcessBar : UserControl { public ProcessBar() { //

  • c#进度条 progressBar 使用方法的小例子

    复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Mes.Core; namespace HCMDoImport{    public partial class ProcessBarForm : B

  • C#中常使用进度条的代码

    复制代码 代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Diagnostics; using System.Threading; namespace WindowsApplication2 { /// <summary> /// 

  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作.在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的

  • C#实现带进度条的ListView

    推荐阅读:ListView 百分比进度条(delphi版) 对于已经有的组件,可以直接添加进来,添加后要先运行一下,然后会在工具箱内找到相应控件. 1.首先编写组件,然后将组件添加到工具箱内 编写代码如下: public partial class ListViewEx : System.Windows.Forms.ListView { public ListViewEx() { InitializeComponent(); } //C# listview进度条显示 private Color

  • C# Oracle批量插入数据进度条的实现代码

    前言 由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中.考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法.在插入操作运行时,会造成系统短暂的"卡死"现象.为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度. 批量插入 项目中运用的是System.Data.OracleClient.首先将Excel数据通过转换函数转换为DataTable,其中的字段和数据库中相应表格的字段完全对应. public int Impor

  • Oracle批量插入数据的三种方式【推荐】

    第一种: begin insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,val

  • ORACLE大批量插入数据的详细步骤

    目录 尝试了一下几种方式: 一.关闭日志,数据追加模式 二:PARALLEL模式(并行进程数要谨慎 ) 总结 最近有几张表随着时间不断的增长,表中的数据量也越来越大,想把原来的表改成分区表,需要两个步骤: 一:建立分区表 二:把源表的数据迁移到分区表中 但是源表的数据量是1亿的数据量,按照最普遍的方式 INSERT INTO 效率太低了 尝试了一下几种方式: 一.关闭日志,数据追加模式 1.关闭表日志功能 ALTER  TABLE  TABLE_NAME  NOLOGGING; comments

  • Java实现mybatis批量插入数据到Oracle

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &q

  • MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    一.mybatis批量插入数据到Oracle中的两种方式: 第一种: <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item" index="index" collection="list"> INTO

  • mybatis foreach批量插入数据:Oracle与MySQL区别介绍

    下面给大家介绍mybatis foreach批量插入数据:Oracle与MySQL不同点: •主要不同点在于foreach标签内separator属性的设置问题: •separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... •separator设置为"union all"分割时,最终拼接的代码形式为:insert into table

  • 详解mybatis批量插入10万条数据的优化过程

    数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下: package com.lcy.service.mapper; import com.lcy.service.pojo.TestVO; import org.apache.ibatis.annotations.Insert; import java.util.List; public interface TestMapper { @Insert("") Integer test

  • Oracle + Mybatis实现批量插入、更新和删除示例代码

    前言 Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查.数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事务只提交一条数据,会造成非常大的数据库资源浪费,导致数据库性能.系统性能大幅度下降. 关于mybatis的批量插入,网上的多数示例多半是关于MySQL数据库的,关于Oracle数据库的例子比较少.本文将给大家介绍关于Oracle+Mybatis批量插入.更新和删除的相关内容,下面话不多说了,来

  • 如何在mybatis中向BLOB字段批量插入数据

    最近接手一个需求,需要用xxl-job定时任务同步三方库中新增的数据,粗略一看挺得意,以为一两小时就搞定了,但事与愿违,编码两小时却被一个BLOB字段玩了一下午. 每次获取50条数据过来,每条数据中有一个字段是BLOB类型的图片,需求也要将图片放入数据库(个人不建议这么玩,生产上千万的数据会造成数据库很臃肿,建议放到ftp或者minio上比较好),字段中的图片过来时已经被转换成了base64的格式,在往数据库批量插入时,数据库BLOB字段对应的实体使用byte[],程序执行时报了如下错误: or

  • MySQL和Oracle批量插入SQL的通用写法示例

    目录 举个例子: 通用写法: 总结 举个例子: 现在要批量新增User对象到数据库USER表中 public class User{ //姓名 private String name; //年龄 private Integer age; //性别 private Integer sex } 大部分人对MySQL比较熟悉,可能觉得批量新增的SQL都是这样写,其实并不然.该写法在MySQL中没问题,而在Oracle中,这样写就会报错. MySQL写法: INSERT INTO USER (NAME,

随机推荐