[ Foro de C# ]

problema con el componente background worker

10-Feb-2016 16:57
Ramón Zoquier Gómez
1 Respuestas

Estoy teniendo problemas para ejecutar un insert a una base de datos SQL desde C#, lo estoy haciendo con el componente background worker ya que son muchos registros, pero se queda ejecutando y ejecutando, y aplica hasta 3 veces el insert, a parte de eso, la progress bar no actualiza.

Este es el código que estoy utilizando:

 private void btnGuardar_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
       {
           if (!backgroundWorker1.IsBusy)
           {
               progressBar1.Visible = true;
               lblProgreso.Visible = true;
               backgroundWorker1.RunWorkerAsync();
           }
       }

       private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
       {
           for (int i = 1; i <= 100; i++)
           {
               System.Threading.Thread.Sleep(100);
               backgroundWorker1.ReportProgress(i);
               if (backgroundWorker1.CancellationPending == true)
               {
                   e.Cancel = true;
                   break;
               }
               else
               {
                   GuardarNomina guardarNomina = new GuardarNomina();
                   guardarNomina.ExportarNomina(nomina.datos);
               }
           }
       }

       private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
       {
           progressBar1.Value = e.ProgressPercentage;
           lblProgreso.Text = e.ProgressPercentage + "%";
       }

       private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
       {
           MessageBox.Show("Nómina exportada a la Base de Datos con éxito!", "CoopNomina", MessageBoxButtons.OK,
               MessageBoxIcon.Information);
           lblProgreso.Visible = false;
           progressBar1.Visible = false;
           progressBar1.Value = 0;
       }

Y esta es la clase que estoy utilizando para guardar en la base de datos.
public void ExportarNomina(List<nomina> datos)
       {
           SqlConnection cn = new SqlConnection(DB.CadenaConexion);
           cn.Open();
           
           try
           {
               foreach (nomina listaNomina in datos)
               {
                   SqlCommand cm = new SqlCommand("GUARDAR_NOMINA", cn);
                   cm.CommandType = CommandType.StoredProcedure;
                   cm.Parameters.AddWithValue("@anyo",Convert.ToInt32(listaNomina.Anyo));
                   cm.Parameters.AddWithValue("@mes", Convert.ToInt32(listaNomina.Mes));
                   cm.Parameters.AddWithValue("@tarjeta", listaNomina.Tarjeta);
                   cm.Parameters.AddWithValue("@nombre", listaNomina.Nombre);
                   cm.Parameters.AddWithValue("@apellido", listaNomina.Apellido);
                   cm.Parameters.AddWithValue("@sexo", listaNomina.Sexo);
                   cm.Parameters.AddWithValue("@cedula", listaNomina.Cedula);
                   cm.Parameters.AddWithValue("@cargo", listaNomina.Cargo);
                   cm.Parameters.AddWithValue("@descuento", Convert.ToDouble(listaNomina.Descuento));

                   cm.ExecuteNonQuery();
               }
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message.ToString());
           }
           finally
           {
               cn.Close();
           }
       }

Espero que puedan ayudarme.

Gracias.


15-Feb-2016 00:29
Nacho Cabanes (+84)

Lo lamento, no he usado (¿todavía?) background workers, yo no podré adyudarte con ellos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)