C# 从Excel导入数据期间显示进度条控件devexpress

C# 从Excel导入数据期间显示进度条控件devexpress,c#,excel,winforms,devexpress,progress-bar,C#,Excel,Winforms,Devexpress,Progress Bar,我有这样的表格导入数据Excel: 第一种情况是,当我选择文件Excel然后按process时,我的表单将显示process in progress bar control devexpress 我的代码: string constr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + txtPath.Text + "; Extended Properties =\"Excel 8.0; HDR = Yes;\";"; Ol

我有这样的表格导入数据Excel:

第一种情况是,当我选择文件Excel然后按process时,我的表单将显示process in progress bar control 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数据库的过程中,有人能建议如何显示进度条控制过程吗?

使这一过程更容易

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\u DoWork
事件处理程序中移动
Insert
循环

private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // insert loop
}
5) 设置
WorkerReportsProgress
true,并在循环中调用
ReportProgress
方法

backgroundWorker1.WorkerReportsProgress = true;
int progress = 0;
while (odr.Read())
{
    backgroundWorker1.ReportProgress(++progress);
}
6) 增加
BackgroundWorker1\u ProgressChanged
事件处理程序中的值

private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressbarcontrol.Value = e.ProgressPercentage;
}
此外,您还可以在
RunWorkerCompleted
事件处理程序中重置进度条。

由works great给出的答案非常有用。解释得很清楚。因为我使用的是devexpress,所以我只需要添加一些更改就可以让它为我工作。万一有人需要它

private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressbarcontrol.Value = e.ProgressPercentage;
}
在步骤3中:

progressbarcontrol.Maximum = count;
改为:

progressbarcontrol.Properties.Maximum = count;
progressbarcontrol.EditValue = e.ProgressPercentage;
并在以下内容后添加此行:

backgroundWorker1.RunWorkerAsync();
在步骤6中:

progressbarcontrol.Value = e.ProgressPercentage;
改为:

progressbarcontrol.Properties.Maximum = count;
progressbarcontrol.EditValue = e.ProgressPercentage;

希望有帮助

谢谢,…它可以工作,…我只是添加了查询来检查excel文件的计数,并将其设置为
progressbarcontrol.max=count并且它可以工作,。。很好,…那太有用了。。