前言
由于项目需求,需要将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#实现SQL批量插入数据到表的方法,包括了C#实现SQL批量插入数据到表的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现SQL批量插入数据到表的方法。分享给大家供大家参考,具体如下: 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》 希望本
C# Winform编程 连接sqlite3 进行批量更新 想把方法抽出进行解耦 但有对进度条的控制内容 如何让进度中每一个更新,能够转递给外部的控件 progressBar1
本文向大家介绍jquery插件uploadify实现带进度条的文件批量上传,包括了jquery插件uploadify实现带进度条的文件批量上传的使用技巧和注意事项,需要的朋友参考一下 有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案,分享给大家供大家参考,具体如下 先上效果图: 具体代码如下: 在页面中如下 完整页面代码 UploadHandler.ashx代码
本文向大家介绍Oracle + Mybatis实现批量插入、更新和删除示例代码,包括了Oracle + Mybatis实现批量插入、更新和删除示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事务
本文向大家介绍Oracle批量插入数据的三种方式【推荐】,包括了Oracle批量插入数据的三种方式【推荐】的使用技巧和注意事项,需要的朋友参考一下 第一种: 第二种: 第三种(利用中间表): 总结 以上所述是小编给大家介绍的Oracle批量插入数据的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
问题内容: 我有一些每月的天气数据,我想插入到Oracle数据库表中,但是我想成批插入相应的记录,以提高效率。谁能建议我如何用Python做到这一点? 例如,假设我的表有四个字段:工作站ID,日期和两个值字段。记录由工作站ID和日期字段(复合键)唯一标识。我将为每个站点插入的值将保存在一个列表中,其中包含X整整年的数据值,因此,例如,如果有两年的值,则值列表将包含24个值。 如果我想一次插入一条记