C# 如何避免;“没有回应”;从Excel到SQL SERVER的大型导入中表单中的消息
我的程序将数据从Excel导入或导出到数据库。您必须从中选择所需的excel文件,打开“文件”对话框,然后单击“发送”按钮 编辑:问题是当我导入方法时,它会使我的表单显示“无响应”消息。CargarNumero()方法对每个插入进行选择和更新(此表有7K行)C# 如何避免;“没有回应”;从Excel到SQL SERVER的大型导入中表单中的消息,c#,sql-server,excel,forms,C#,Sql Server,Excel,Forms,我的程序将数据从Excel导入或导出到数据库。您必须从中选择所需的excel文件,打开“文件”对话框,然后单击“发送”按钮 编辑:问题是当我导入方法时,它会使我的表单显示“无响应”消息。CargarNumero()方法对每个插入进行选择和更新(此表有7K行) 导入 private void importarDatos() { DB con = new DB(path); string tabNombre = ""; string tabApell
导入
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");
}
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的EventHandler中创建表单B并显示它。您希望在A(从B)中显示的数据,可以填充到列表中,或者任何时候都可以将其检索
另一种方法是使用自定义事件,这些事件将在表单之间发出信号,表示需要对来自Eventarguments的数据进行处理。我在这个线程中找到了解决方案。如果有人需要帮助
我遇到的问题是,当我在if(rbsustituva.Checked)中调用cExcel.Show()时,它不会显示其他表单的标签和文本,但在if(rbSustitutiva.Checked)中,第一个cExcel.Show运行正常,但第二个没有(我的意思是,当它有连接和commandtext时,它不能正常工作,但我不知道是否是因为它)。老实说,我不知道问题在哪里,我不相信你会很快发现它。我能看到大约100行代码(甚至更多)在一个方法事件处理程序中。这太疯狂了。你应该以一种更有意义的方式重构此代码,你会发现错误更容易。你有几个独立的代码块。首先你应该有一个数据访问层。其次,你可以对复选框场景使用几种策略。请重构它。我怀疑你会发现任何愿意调试100行代码的人。是的,这就是我要做的。对不起,我是一个初学者。因为您调用了cExcel,所以无法看到您的更改。退出第一个代码时关闭。我的表单(b)由于显示数据导入的进度,只有2个标签和2个文本框。在这两种情况下都显示了表单,但我遇到的问题是,它既不显示标签也不显示文本框(实际上它甚至不显示元素的格式属性,如背景色等)。