oracle进度条,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

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值