如何从Excel文件读取并保存在DB上时使用BackGroundWorker

问题描述 投票:0回答:2

我具有加载Excel的功能,先读取它,然后将信息保存在数据库中,而在读取和保存信息时,我的界面被阻止。我想通过进度栏显示我的用户。我知道我必须使用BackGroundWorker,但是我不明白如何在我的函数中实现它

这是我的功能:

private void Btn_Load_Click(object sender, RoutedEventArgs e)
    {
            DataSet validarnumorder;
            dayNum = dayNumber;

            saveFile = new OpenFileDialog();
            saveFile.DefaultExt = ".xlsx";
            saveFile.Filter = "Excel files (*.xls or .xlsx)|.xls;*.xlsx";
            saveFile.Title = "Open an image";
            saveFile.AddExtension = true;
            if (saveFile.ShowDialog() == true)
            {
            load.Visibility = Visibility.Visible;
            fileName = saveFile.FileName;
                Console.WriteLine(saveFile.SafeFileName);
                Console.WriteLine(saveFile.FileName);
                oXL = new Excel.Application();
                oXL.Visible = false;
                Doc = oXL.Workbooks.Open(fileName);
                ooSheet = (Microsoft.Office.Interop.Excel._Worksheet)Doc.ActiveSheet;

            if (saveFile.FileName.Equals(""))
                {
                    MessageBox.Show("No se encontro archivo");
                }
                else
                {
                    //La busqueda de valores en el archivo de excel que se encuentre abierto empieza en la fila 2, por eso a la variable s se le está asignando el valor de 2.
                    s = 2;

                            do
                            {


                    //La variable validarorderNum valida si el número de orden existe en la base de datos, por lo que en caso de que ya exista el número de orden, se lance un mensaje que le indique a la persona que el número de orden ya existe en la aplicación por lo que no puede volverlo a ingresar ya que los número de orden no pueden estar repetidos en el programa.

                    validarnumorder = conexion.fillTable("select NumOrder from [tblAssemblyOrder] where NumOrder='" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("A" + s + "").Value + "' ");
                    if (validarnumorder.Tables["Table"].Rows.Count == 0)
                           {
                        //Se inicializa un insert en la base de datos en dado caso de que el número de orden no exista en la base de datos y le asigna los valores cargados en el excel con el plan de producción.
                    conexion.conexionSql("insert into [mytable] ([first] ,[first] ,[first] ,[first],[Users] ,[first], [first], [first]) values ('" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("A" + s + "").Value + "', '" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("C" + s + "").Value + "', '" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("B" + s + "").Value + "','" + dayNum + "', 0, 0, 0, '" + dayNum + "') ");

                   conexion.conexionSql("insert into [mytable2] ([first] ,[first],[first],[first],[first] ,[first],[first], [first],  [first], [first]) values ('" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("A" + s + "").Value + "', '" + 0 + "', '" + 0 + "', '" + 0 + "', '" + null + "','" + "NORMAL" + "', '" + null + "', '" + "Nothing" + "', '" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("D" + s + "").Value + "', '" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("E" + s + "").Value + "') ");


                                }
                                else
                                {
          MessageBox.Show("En el plan cargado se encuentra un número de orden ya existente, el número de orden es: '" + oXL.Application.ActiveWorkbook.ActiveSheet.Range("A" + s + "").Value + "'");
                                }
                                s++;
       } while (oXL.Application.ActiveWorkbook.ActiveSheet.Range("A" + s + "").Value != null);
                load.Visibility = Visibility.Hidden;
        MessageBox.Show("Información guardada con exito");
         saveFile.FileName = null;
                }
                Doc.Close();
                ooSheet = null;
                Doc = null;
                oXL = null;
            }
            else
            {
                MessageBox.Show("No se encontro el archivo", "E-Flex");
            }



            ListView();       

    }
c# wpf backgroundworker
2个回答
0
投票

您可以使用线程来解决您的问题

 var thread = new Thread(() =>
            {
               //your saving file code
            });
        thread.Start();
        thread.IsBackground = true; 

0
投票

您应该学习如何使用异步和等待,我认为bkgr将会过时...

private BackgroundWorker bgWk_Test;

启动您的bkgr实例

        bgWk_Test = new BackgroundWorker();
        bgWk_Test.DoWork += bgWk_Test_Exec_DoWork;
        bgWk_Test.ProgressChanged += bgWk_Test_Exec_ProgressChanged;
        bgWk_Test.RunWorkerCompleted += bgWk_Test_Exec_RunWorkerCompleted;
        bgWk_Test.WorkerSupportsCancellation = true;
        bgWk_Test.WorkerReportsProgress = true;

在这里做您的长程序,并发送报告进度

private void bgWk_Test_DoWork(object sender, DoWorkEventArgs e)
    {
// do your long process here 
....
// report progress
  bgWk_Test.ReportProgress(i);
}

UI的进度

private void bgWk_Test_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        your progress bar value ++;
    }

此事件在bkgr完成任务后触发

private void bgWk_Test_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
// do stuff when you bk is finished...
}
© www.soinside.com 2019 - 2024. All rights reserved.