C# Oracle批量插入数据进度条制做

前言

因为项目需求,须要将Excel中的数据进过必定转换导入仅Oracle数据库中。考虑到当Excel数据量较大时,循环Insert语句效率过低,故采用批量插入的方法。在插入操做运行时,会形成系统短暂的“卡死”现象。为了让用户知道插入的状态,须要制做一个进度条来显示插入的进度。数据库

批量插入

项目中运用的是System.Data.OracleClient。首先将Excel数据经过转换函数转换为DataTable,其中的字段和数据库中相应表格的字段彻底对应。oracle

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这个事件便可记录已插入多少条数据,显示插入进度。ui

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
}

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

相关文章
相关标签/搜索