C# Oracle批量插入数据进度条的实现代码
程序员文章站
2023-12-18 23:23:46
前言
由于项目需求,需要将excel中的数据进过一定转换导入仅oracle数据库中。考虑到当excel数据量较大时,循环insert语句效率太低,故采用批量插入的方法。在...
前言
由于项目需求,需要将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批量插入数据进度条的实现代码,希望对大家有所帮助