2016-11-08 2 views
-1

Ich muss etwa 25 tausend Zeilen in MS Access einfügen und es dauert zu lange (3 Stunden + -), gibt es eine Möglichkeit, es zu optimieren?WPF C# Access Insert Optimierung

Zuerst überprüfe ich, ob das Register in der DB existiert, wenn nicht ich einfüge, sonst aktualisiere ich. Jetzt teste ich gerade erst ein (erstes Mal, Tisch ist leer). Vor dem Einfügen muss ich einige Daten formatieren.

conn = new OleDbConnection(Conexao.getConexao()); 
conn.Open(); 


foreach (Pendencia pendencia in listaPendeciaNassau) 
{ 
    if (!PendenciaNassauExisteVerificar(pendencia.PendenciaId)) 
    { 

    if (!String.IsNullOrEmpty(pendencia.Contrato)) 
    { 
     //Insert na tabela do BD 
     OleDbCommand cmd = new OleDbCommand("INSERT INTO tblImportacao(" + 
                     " Contrato, " + 
                     " Tipo, " + 
                     " PendenciaNivel, " + 
                     " PendenciaNassauId, " + 
                     " PendenciaTipo, " + 
                     " GarantiaDescricao, " + 
                     " Observacao, " + 
                     " AberturaData, " + 
                     " VencimentoData, " + 
                     " CarenciaInicio, " + 
                     " CarenciaFim, " + 
                     " DiasDecorridos, " + 
                     " DiasPendentes, " + 
                     " Produto, " + 
                     " ClienteGrupo, " + 
                     " ClienteNome, " + 
                     " Rating, " + 
                     " ClienteCnpj, " + 
                     " Officer, " + 
                     " CentroCusto, " + 
                     " Moeda, " + 
                     " OperacaoValor, " + 
                     " LiquidacaoData, " + 
                     " PendenciaIdComposto, " + 
                     " Lastro, " + 
                     " Corretora, " + 
                     " AdAm, " + 
                     " MnMe, " + 
                     " PendenciaTipoMacro, " + 
                     " Segmento, " + 
                     " PendenciaOrigem, " + 
                     " ImportacaoData, " + 
                     " PorContrato" + 
                     ") " + 
                 "VALUES (" + "'" + pendencia.Contrato + "'" + 
                     "," + "'" + pendencia.Tipo + "'" + 
                     "," + "'" + pendencia.PendenciaNivel + "'" + 
                     "," + "'" + pendencia.PendenciaId + "'" + 
                     "," + "'" + pendencia.PendenciaTipo + "'" + 
                     "," + "'" + pendencia.GarantiaDescricao + "'" + 
                     "," + "'" + pendencia.Observacao + "'" + 
                     "," + (String.IsNullOrEmpty(pendencia.AberturaData.Trim()) ? "null" : "#" + pendencia.AberturaData + "#") + 
                     "," + (String.IsNullOrEmpty(pendencia.VencimentoData.Trim()) ? "null" : "#" + pendencia.VencimentoData + "#") + 
                     "," + (String.IsNullOrEmpty(pendencia.CarenciaInicioData.Trim()) ? "null" : "#" + pendencia.CarenciaInicioData + "#") + 
                     "," + (String.IsNullOrEmpty(pendencia.CarenciaFimData.Trim()) ? "null" : "#" + pendencia.CarenciaFimData + "#") + 
                     "," + "'" + pendencia.DiasDecorridos + "'" + 
                     "," + "'" + pendencia.DiasPendentes + "'" + 
                     "," + "'" + pendencia.Produto + "'" + 
                     "," + "'" + pendencia.ClienteGrupo + "'" + 
                     "," + "'" + pendencia.ClienteNome + "'" + 
                     "," + "'" + pendencia.Rating + "'" + 
                     "," + "'" + pendencia.ClienteCnpj + "'" + 
                     "," + "'" + pendencia.Officer + "'" + 
                     "," + "'" + pendencia.CentroCusto + "'" + 
                     "," + "'" + pendencia.Moeda + "'" + 
                     "," + "'" + (String.IsNullOrEmpty(pendencia.OperacaoValor) ? String.Empty : RetornarValorMonetarioFormatado(pendencia.OperacaoValor)) + "'" + 
                     "," + (String.IsNullOrEmpty(pendencia.LiquidacaoData.Trim()) ? "null" : "#" + pendencia.LiquidacaoData + "#") + 
                     "," + "'" + pendencia.PendenciaIdComposto + "'" + 
                     "," + "'" + pendencia.Lastro + "'" + 
                     "," + "'" + pendencia.Corretora + "'" + 
                     "," + "'" + pendencia.AdAm + "'" + 
                     "," + "'" + pendencia.MnMe + "'" + 
                     "," + "'" + pendencia.PendenciaTipoMacro + "'" + 
                     "," + "'" + pendencia.Segmento + "'" + 
                     "," + "'PGPNassau'" + 
                     ",#" + DateTime.Now + "#" + 
                     "," + "'" + pendencia.PorContratoDescricao + "'" + 
                     ");", conn); 
     cmd.ExecuteNonQuery(); 
    } 
    } 
} 

private bool PendenciaNassauExisteVerificar(int pendenciaId) 
{ 
    bool existe = false; 

OleDbConnection conn = null; 


#region Select e conversão do DataSet 
try 
{ 
    conn = new OleDbConnection(Conexao.getConexao()); 
    conn.Open(); 

    //Select da tabela tblPendencia 
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * " + 
               "FROM tblImportacao I" + 
               " WHERE I.pendenciaNassauId = " + pendenciaId, conn); 

    DataSet ds = new DataSet(); 
    da.Fill(ds, "tblPendencia"); 
    DataTable dt = new DataTable(); 
    dt = ds.Tables["tblPendencia"]; 


    if (ds.Tables != null && ds.Tables[0].Rows.Count > 0) 
    { 
     existe = true; 
    } 


} 

catch (Exception ex) 
{ 
    EventLog.WriteEntry(APLICACAO, ex.Message, EventLogEntryType.Error, 234); 
} 

finally { conn.Close(); } 

return existe; 

#endregion 
} 
+0

Gibt es einen Index für 'PendenciaNassauId'? Ist dies nicht der Fall, muss die Datenbank beim Einfügen der Zeilennummer 25000 24999 andere Zeilen überprüfen, falls sie diese Zeile enthalten. Und als Sie Zeile 24999 eingefügt haben, musste es 24998 Zeilen überprüfen ... und so weiter. Es gibt noch andere Dinge, die optimiert werden müssen (z. B. keinen vollständigen 'DataAdapter' verwenden, wenn ein einfaches' Command.ExecuteScalar' genügt), aber das wäre das erste zu überprüfende Element. –

+0

Wenn Sie immer in eine leere Tabelle einfügen, können Sie auch Duplikate in Ihren Quelldaten eliminieren, bevor Sie überhaupt mit dem Einfügen beginnen, was die Dinge sicherlich noch beschleunigen würde. Wenn Ihre Quelldaten keine Duplikate enthalten, aber möglicherweise widersprüchliche Zeilen im Ziel vorhanden sind, können Sie alle vorhandenen IDs aus dem Ziel auswählen und anschließend alle übereinstimmenden Zeilen in der Quelle entfernen. Unterm Strich minimieren Sie die Dinge, die Sie tun, um tatsächlich einzufügen. –

+0

Wenn Sie diese große String-Verkettung jedes Mal durchführen, wird Ihre Performance ebenfalls zunichte gemacht. Sie sollten besser eine parametrisierte Abfrage in der Schleife verwenden. – Kevin

Antwort

0

Nach einiger Zeit der Box Denkens heraus, haben wir beschlossen, dass das Beste, was eine Kopie der db in der lokalen Maschine, die Arbeit in ihm zu tun ist, und es dann zurück an den Server kopieren zu machen. Jetzt dauert der ganze Prozess ungefähr 15 Minuten!

Manchmal ist nur die Codierung nicht die Lösung.

Danke für die Bemühungen aller!