如何避免在大型表单中"Not Responding"消息 从 Excel 导入到 SQL 服务器



我的程序将数据从 Excel 导入/导出到我的数据库/从我的数据库导出数据。您必须选择所需的excel文件并打开文件对话框,然后单击"发送"按钮。

编辑:问题是当我执行导入方法时,它使我的表单显示"无响应"消息。CargarNumero() 方法为每个 INSERT 进行选择和更新(此表有 7K 行)。

Import

private void importarDatos()
{
        DB con = new DB(path);
        string tabNombre = "";
        string tabApellidos = "";
        string tabID = "";
        SqlDecimal tabImporte = 0;
        int porc = 0;
        string year = "";
        Excel.Application xlApp = new Excel.Application();
        Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(txtFilePath.Text);
        Excel._Worksheet xlWorksheet = (Excel._Worksheet)xlWorkbook.Sheets[1];
        Excel.Range xlRange = xlWorksheet.UsedRange;
        xlRange = xlWorksheet.get_Range("A1", Missing.Value);
        xlRange = xlRange.get_End(Excel.XlDirection.xlToRight);
        xlRange = xlRange.get_End(Excel.XlDirection.xlDown);
        string downAddress = xlRange.get_Address(
            false, false, Excel.XlReferenceStyle.xlA1,
            Type.Missing, Type.Missing);
        xlRange = xlWorksheet.get_Range("A1", downAddress);
        object[,] values = (object[,])xlRange.Value2;
        int rowCount = values.GetLength(0);
        int colCount = values.GetLength(1);
        CargaProgreso cp = cargarProgreso();
        cp.Show();
        if ((cboYear.Visible) && (!cboYear.Text.Equals("")))
        {
            year = cboYear.Text;
        }
        else
        {
            year = DateTime.Now.Year.ToString();
        }
        for (int i = 2; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                if (j == 1)
                {
                    tabNombre = values[i, j].ToString();
                }
                else if (j == 2)
                {
                    tabApellidos = values[i, j].ToString();
                }
                else if (j == 3)
                {
                    tabID = values[i, j].ToString();
                }
                else
                {
                    tabImporte = Convert.ToDecimal(values[i, j].ToString());
                }
            }
            string query = "INSERT...";
            try
            {
                porc = Convert.ToInt32(i * 100 / rowCount);
                cp.Progreso.Value = porc;
                con.Consulta(query);
                Thread.Sleep(1);
                con.Cerrar();
                cargarNumero();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error en la importación " + ex);
            }
        }
        cp.Close();
        MessageBox.Show("Importación de datos completada");
    }

Export

private void exportarDatos(Excel.Application xlApp, Excel.Workbook xlWorkbook)
    {
        SaveFileDialog sfd = new SaveFileDialog();
        string ruta = "*";
        sfd.InitialDirectory = ruta;
        sfd.DefaultExt = "xlsx";
        sfd.Filter = "Excel Files |*.xls;*.xlsx;*.xlsm;*.xlsb";
        DB con = new DB(path);
        int porc = 0;
        CargaProgreso cp = cargarProgreso();
        cp.Text = "Exportando a Excel...";
        SqlDataAdapter da = new SqlDataAdapter("*", con.Conexion);
        System.Data.DataTable dt = new System.Data.DataTable();
        da.Fill(dt);
        DataColumnCollection dcCollection = dt.Columns;
        if (!Directory.Exists(ruta))
        {
            DirectoryInfo di = Directory.CreateDirectory(ruta);
        }
        DialogResult dialogResult = MessageBox.Show("¿Desea guardar la Copia de seguridad?", "Copia de seguridad", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                for (int i = 1; i < (dt.Rows.Count + 1); i++)
                {
                    for (int j = 1; j < (dt.Columns.Count + 1); j++)
                    {
                        if (i == 1)
                        {
                            xlApp.Cells[i, j] = dcCollection[j - 1].ToString();
                        }
                        xlApp.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString();
                    }
                    porc = Convert.ToInt32(i * 100 / dt.Rows.Count);
                    cp.Progreso.Value = porc;  
                }
                cp.Close();
                xlWorkbook.SaveCopyAs(sfd.FileName);
                xlWorkbook.Saved = true;
                xlWorkbook.Close();
                MessageBox.Show("Copia de Seguridad creada en " + sfd.FileName);
            }
        }
        con.Cerrar();
        cp.Close();
    }

您需要以一种形式引用另一种形式。您可以在 A 的事件处理程序中创建表单 B 并显示它。您希望在 A 中可见的数据(从 B 开始),您可以填充到列表中,或者其他任何内容并检索它。

另一种方法是使用自定义事件,这些事件将在表单之间发出信号,表明来自 Eventarguments 的数据需要发生某些事情

我在这个线程中找到了解决方案。如果其他人需要帮助。

https://stackoverflow.com/a/11027023/6223629