C# Oracle批量插入数据进度条的实现代码
前言
由于项目需求,需要将Excel中的数据进过一定转换导入仅Oracle数据库中。考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。
批量插入
项目中运用的是System.Data.OracleClient。首先将Excel数据通过转换函数转换为DataTable,其中的字段和数据库中相应表格的字段完全对应。
publicintImport2Oracle(ISheetsheet,stringtablename) { DataTabledt=GetDataFromExcelByNPOI(sheet);//经过转换后获得DataTable OracleCommandcmd=conn.CreateCommand();//conn为数据库连接对象 OracleDataAdapterda=newOracleDataAdapter(cmd); OracleCommandBuilderocb=newOracleCommandBuilder(da); stringSelectSQL="select*from"+tablename+"whereROWNUM=0"; da.SelectCommand.CommandText=SelectSQL; da.InsertCommand=ocb.GetInsertCommand(); da.Update(dt); return1;//返回正常 }
上述代码没有列出连接Oracle数据库相关代码,该段代码将DataTable批量插入数据库中。为了利用进度条控件实现显示插入的进度,需要在每次成功插入一条数据后更新进度条。
进度条实现
为了实现实时更新插入进度,需要用到OracleDataAdapter类下RowUpdated事件。官方文档中有注释,当使用Update方法时,在每一条记录更新时会发生两个事件,即OnRowUpdating和OnRowUpdated。利用OnRowUpdated这个事件即可记录已插入多少条数据,显示插入进度。
intSum=0;//总记录数 introwNum=0;//插入记录数 publicintImport2Oracle(ISheetsheet) { Sum=sheet.LastRowNum-1;//获取总记录数 DataTabledt=GetDataFromExcelByNPOI(sheet);//经过转换后获得DataTable,利用到了NPOI OracleCommandcmd=conn.CreateCommand();//conn为数据库连接对象 OracleDataAdapterda=newOracleDataAdapter(cmd); OracleCommandBuilderocb=newOracleCommandBuilder(da); stringSelectSQL="select*fromGZGDZL."+tablename+"whereROWNUM=0"; da.SelectCommand.CommandText=SelectSQL; da.InsertCommand=ocb.GetInsertCommand(); //update,thisoperationfirestwoevents //(RowUpdating/RowUpdated)perchangedrow //这里只用到RowUpdated事件 da.RowUpdated+=newOracleRowUpdatedEventHandler(OnRowUpdated); da.Update(dt); return1;//返回正常 } //OnRowUpdated事件 privatevoidOnRowUpdated(objectsender,OracleRowUpdatedEventArgse) { //刷新界面进度条 rowNum=rowNum+1; reportValue=(int)(rowNum/m_sheet.LastRowNum*100); this.progressBar1.Value=percent;//progressBar控件已经设置最大值为100,最小值为0 }
经过改进后以上代码即可让用户实时看到数据插入进度,虽然在一定程度上会影响插入的效率,但换来了用户对插入状态的了解,而且这种影响在数据量不是特别巨大的情况下几乎可以忽略。
总结
以上所述是小编给大家介绍的C#Oracle批量插入数据进度条的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!