Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在从Excel文件读取和保存数据库时使用BackGroundWorker_C#_Wpf_Backgroundworker - Fatal编程技术网

C# 如何在从Excel文件读取和保存数据库时使用BackGroundWorker

C# 如何在从Excel文件读取和保存数据库时使用BackGroundWorker,c#,wpf,backgroundworker,C#,Wpf,Backgroundworker,我有一个函数来加载Excel,读取它,然后将信息保存在我的数据库中,同时读取和保存我的界面被阻止的信息。我想通过进度条显示我的用户。我知道我必须使用BackGroundWorker,但我不知道如何在我的函数中实现它 这是我的职责: private void Btn_Load_Click(object sender, RoutedEventArgs e) { DataSet validarnumorder; dayNum = dayNumbe

我有一个函数来加载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();       

    }

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

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

你应该学习如何使用异步和等待,我认为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...
}

这不支持报告进度。您可以将
async
任务与进度报告一起使用