2016-04-28 4 views
-1

Mein Programm importieren und exportieren Daten von/zu einem Excel zu/von meiner Datenbank. Sie müssen die gewünschte Excel-Datei auswählen und den Dateidialog öffnen und dann auf Senden klicken.Wie vermeidet man "nicht reagiert" Nachricht in einem Formular in einem großen Import von Excel nach SQL-Server

Edit: Das Problem ist, dass, wenn ich importieren Methode, es macht mein Formular zeigt "nicht reagiert" Nachricht. Die CargarNumero() -Methode führt eine Auswahl und eine Aktualisierung für jedes einzelne INSERT durch (diese Tabelle hat 7K Zeilen).

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(); 
    } 
+0

Nun können Sie Ihre Änderungen nicht sehen, weil Sie cExcel.Close aufrufen, wenn Sie Ausgang aus dem ersten Code. – Steve

+0

Mein Formular (b) hat nur 2 Etiketten und 2 Textbos, um den Fortschritt des Datenimports anzuzeigen. In beiden Fällen wird das Formular angezeigt, aber wo ich das Problem habe, zeigt es weder die Beschriftungen noch die Textfelder (tatsächlich zeigt es nicht einmal die Formateigenschaften der Elemente wie Hintergrundfarbe usw.). – PoteKing

Antwort

0

benötigen Sie den Verweis auf die andere in einer Form haben. Sie können dies tun, indem Sie Formular B innerhalb eines EventHandlers von A erstellen und anzeigen. Die Daten, die in A (von B) sichtbar sein sollen, können Sie in eine Liste auffüllen oder was auch immer, und Sie können sie abrufen.

Der andere Weg ist benutzerdefinierte Ereignisse zu verwenden, die zwischen den Formen, die etwas geschehen muss mit den Daten, die von dem Eventargument kommen

+0

Das Problem, das ich habe, ist, dass, wenn ich cExcel.Show() in if (rbComplementaria.Checked) es nicht die Etiketten und die Texte der anderen Form aber in if (rbSustitutiva.Checked) die erste cExcel.Show tut in Ordnung aber nicht die zweite (ich meine, wenn es Verbindung und Commandtext hat, funktioniert es nicht richtig, aber ich weiß nicht, ob es deswegen ist). – PoteKing

+0

Ehrlich gesagt, ich habe keine Ahnung, wo das Problem ist und ich glaube nicht, dass Sie es bald finden werden. Was ich sehen kann, ist ungefähr. 100 Codezeilen (oder mehr) in einem Methoden-Event-Handler. Das ist verrückt. Sie sollten diesen Code auf eine sinnvollere Weise umgestalten, und Sie werden den Fehler viel leichter finden. Sie haben mehrere separate Code-Blöcke. Zuallererst sollten Sie eine Datenzugriffsschicht haben. Zweitens können Sie mehrere Strategien für die CheckBox-Szenarien verwenden. Bitte refaktorieren Sie es. Ich bezweifle, dass Sie jemanden finden, der bereit ist, 100 Zeilen Code zu debuggen. – user853710

+0

Ja das werde ich machen. Tut mir leid, ich bin ein Anfänger. – PoteKing

Verwandte Themen