在从 Excel 导入数据期间显示进度条控件 devexpress
Show a Progress Bar Control devexpress during import data from Excel
我有这样的表单导入数据 Excel:
第一个场景,当我 select 文件 Excel 然后按进程时,我的表单将在进度条控制 devexpress 中显示进程。
我的代码:
string constr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + txtPath.Text + "; Extended Properties =\"Excel 8.0; HDR = Yes;\";";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand ocmd = new OleDbCommand("SELECT * FROM[Sheet1$]", con);
con.Open();
OleDbDataReader odr = ocmd.ExecuteReader();
string kode = "";
string nama = "";
string satuan = "";
string isAktif = "";
string kodeRek = "";
while (odr.Read())
{
//get value from excel file column
kode = odr[0].ToString();
nama = odr[1].ToString();
satuan = odr[2].ToString();
isAktif = odr[3].ToString();
kodeRek = odr[4].ToString();
//connection
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
//insert data excel to oracle database
OracleCommand cd = new OracleCommand();
cd.CommandText = @"INSERT INTO RAWMATERIAL(ID_BAHAN, KODE_BAHAN, NAMA_BAHAN, UNIT, ISAKTIF, JENIS_BAHAN,
HARGA_BAHAN, CREATEDBY, CREATEDDATE, MODIFIEDBY, MODIFIEDDATE)
(SELECT SQ_BAHAN.NEXTVAL, '" + kode + "', '" + nama + "', '" + satuan + "', '" + isAktif +
"', '" + null + "', '" + null + "', '" + Program.UserLogin + "', '" + DateTime.Now +
"', '" + Program.UserLogin + "', '" + DateTime.Now +
"' FROM DUAL WHERE NOT EXISTS(SELECT * FROM RAWMATERIAL WHERE NAMA_BAHAN='" + nama + "'))";
cd.Connection = koneksi_manual.con;
cd.ExecuteReader();
}
odr.Close();
当我从 Excel 向 Oracle 数据库插入数据时 运行 很好。
谁能建议如何在从 Excel 向 Oracle 数据库插入数据期间显示进度条控制过程?
BackgroundWorker
让这更容易。
1) 将 BackgroundWorker
控件拖放到设计视图中的窗体。
2) 注册 DoWork
和 ProgressChanged
事件处理程序。
backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
3) 设置要插入的记录数。
OleDbCommand ocCount = new OleDbCommand("SELECT COUNT(*) FROM [Sheet1$]", con);
con.Open();
int count = (int)ocCount.ExecuteScalar();
progressbarcontrol.Maximum = count;
4) 在BackgroundWorker1_DoWork
事件处理程序
中移动Insert
循环
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// insert loop
}
5) 设置WorkerReportsProgress
为真,并在循环内调用ReportProgress
方法
backgroundWorker1.WorkerReportsProgress = true;
int progress = 0;
while (odr.Read())
{
backgroundWorker1.ReportProgress(++progress);
}
6) 增加 BackgroundWorker1_ProgressChanged
事件处理程序中的值。
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressbarcontrol.Value = e.ProgressPercentage;
}
此外,您可以在 RunWorkerCompleted
事件处理程序中重置进度条。
jhmt works great. Very nice and clean explanation. Just adding some changes I needed to make it work for me, since I'm using devexpress ProgressBarControl给出的答案。万一有人需要它...
在第 3 步中:
progressbarcontrol.Maximum = count;
更改为:
progressbarcontrol.Properties.Maximum = count;
并在之后添加此行:
backgroundWorker1.RunWorkerAsync();
在第 6 步中:
progressbarcontrol.Value = e.ProgressPercentage;
更改为:
progressbarcontrol.EditValue = e.ProgressPercentage;
希望对您有所帮助!
我有这样的表单导入数据 Excel:
第一个场景,当我 select 文件 Excel 然后按进程时,我的表单将在进度条控制 devexpress 中显示进程。
我的代码:
string constr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + txtPath.Text + "; Extended Properties =\"Excel 8.0; HDR = Yes;\";";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand ocmd = new OleDbCommand("SELECT * FROM[Sheet1$]", con);
con.Open();
OleDbDataReader odr = ocmd.ExecuteReader();
string kode = "";
string nama = "";
string satuan = "";
string isAktif = "";
string kodeRek = "";
while (odr.Read())
{
//get value from excel file column
kode = odr[0].ToString();
nama = odr[1].ToString();
satuan = odr[2].ToString();
isAktif = odr[3].ToString();
kodeRek = odr[4].ToString();
//connection
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
//insert data excel to oracle database
OracleCommand cd = new OracleCommand();
cd.CommandText = @"INSERT INTO RAWMATERIAL(ID_BAHAN, KODE_BAHAN, NAMA_BAHAN, UNIT, ISAKTIF, JENIS_BAHAN,
HARGA_BAHAN, CREATEDBY, CREATEDDATE, MODIFIEDBY, MODIFIEDDATE)
(SELECT SQ_BAHAN.NEXTVAL, '" + kode + "', '" + nama + "', '" + satuan + "', '" + isAktif +
"', '" + null + "', '" + null + "', '" + Program.UserLogin + "', '" + DateTime.Now +
"', '" + Program.UserLogin + "', '" + DateTime.Now +
"' FROM DUAL WHERE NOT EXISTS(SELECT * FROM RAWMATERIAL WHERE NAMA_BAHAN='" + nama + "'))";
cd.Connection = koneksi_manual.con;
cd.ExecuteReader();
}
odr.Close();
当我从 Excel 向 Oracle 数据库插入数据时 运行 很好。
谁能建议如何在从 Excel 向 Oracle 数据库插入数据期间显示进度条控制过程?
BackgroundWorker
让这更容易。
1) 将 BackgroundWorker
控件拖放到设计视图中的窗体。
2) 注册 DoWork
和 ProgressChanged
事件处理程序。
backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
3) 设置要插入的记录数。
OleDbCommand ocCount = new OleDbCommand("SELECT COUNT(*) FROM [Sheet1$]", con);
con.Open();
int count = (int)ocCount.ExecuteScalar();
progressbarcontrol.Maximum = count;
4) 在BackgroundWorker1_DoWork
事件处理程序
Insert
循环
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// insert loop
}
5) 设置WorkerReportsProgress
为真,并在循环内调用ReportProgress
方法
backgroundWorker1.WorkerReportsProgress = true;
int progress = 0;
while (odr.Read())
{
backgroundWorker1.ReportProgress(++progress);
}
6) 增加 BackgroundWorker1_ProgressChanged
事件处理程序中的值。
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressbarcontrol.Value = e.ProgressPercentage;
}
此外,您可以在 RunWorkerCompleted
事件处理程序中重置进度条。
jhmt works great. Very nice and clean explanation. Just adding some changes I needed to make it work for me, since I'm using devexpress ProgressBarControl给出的答案。万一有人需要它...
在第 3 步中:
progressbarcontrol.Maximum = count;
更改为:
progressbarcontrol.Properties.Maximum = count;
并在之后添加此行:
backgroundWorker1.RunWorkerAsync();
在第 6 步中:
progressbarcontrol.Value = e.ProgressPercentage;
更改为:
progressbarcontrol.EditValue = e.ProgressPercentage;
希望对您有所帮助!