首页 技术 正文
技术 2022年11月12日
0 收藏 602 点赞 3,662 浏览 1846 个字

前言

由于项目需求,需要将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
}

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,026
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,517
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,364
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,145
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,779
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,856