显示一个进度条控件devexpress从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数据库时运行良好。

任何人都可以build议如何显示进度栏控制过程中插入数据从Excel到Oracle数据库?

BackgroundWorker使这更容易。

1)将“devise”视图中的BackgroundWorker控件拖放到窗体中。

2)注册DoWorkProgressChanged事件处理程序。

 backgroundWorker1.DoWork += BackgroundWorker1_DoWork; backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged; 

3)设置你要插入的logging的数量。

 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设置WorkerReportsProgress true,并在循环内调用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给出的答案很好。 非常好,干净的解释。 只需添加一些更改,我需要使它适用于我,因为我正在使用devexpress ProgressBarControl 。 如果有人需要它…

在第3步:

 progressbarcontrol.Maximum = count; 

变成:

 progressbarcontrol.Properties.Maximum = count; 

之后添加了这一行:

 backgroundWorker1.RunWorkerAsync(); 

在步骤6中:

 progressbarcontrol.Value = e.ProgressPercentage; 

变成:

 progressbarcontrol.EditValue = e.ProgressPercentage; 

希望能帮助到你!