博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Oracle批量插入数据进度条制作
阅读量:5293 次
发布时间:2019-06-14

本文共 2132 字,大约阅读时间需要 7 分钟。

前言

由于项目需求,需要将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类下事件。官方文档中有注释,当使用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}

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

转载于:https://www.cnblogs.com/heyyw1119/p/8716213.html

你可能感兴趣的文章
理解运算符重载 4
查看>>
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
断言简介
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>
数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
查看>>
使用pager进行分页
查看>>
吐医疗器械研发可配置性需求的槽点
查看>>
UVA - 1592 Database
查看>>
机器翻译评价指标 — BLEU算法
查看>>
机器学习基石(9)--Linear Regression
查看>>
Min Stack
查看>>
从LazyPhp说起
查看>>
Fine Uploader文件上传组件
查看>>
Spring Boot与Spring的区别
查看>>
查看linux 之mysql 是否安装的几种方法
查看>>