2017-10-10 5 views
0
  • des centaines de csv
  • pour chaque csv je dois sauver des milliers de données rangées dans une table sql
  • J'utilise C# .net, jeu de données, tableadaptes que vous peut lire dans le pseudo code ci-dessous
  • Les performances sont mauvaises: environ 100 lignes/seconde. Comment puis-je améliorer mon code?

Pseudo CodeMise à jour données à l'aide d'un TableAdapter: mauvaises performances

var dsMaster = new DS_Master(); 
var el99TestTableAdapter = new EL_99_TESTTableAdapter(); 

Cycle 
    var el99TestRow = dsMaster.EL_99_TEST.NewEL_99_TESTRow(); 
    dsMaster.EL_99_TEST.Rows.Add(el99TestRow); 
end Cycle 

el99TestTableAdapter.Adapter.Update(dsMaster.EL_99_TEST); 
+0

est SSIS pas une option ici? Sinon, construire un paramétrage d'un gros bloc de SQL permettrait d'exécuter le plus rapidement que je connaisse. Cependant, il y a une limite sur le nombre de paramètres que vous pouvez avoir dans une requête (32 000 je pense), vous devrez donc les grouper si vous avez adopté cette approche. – DiskJunky

+0

Copie possible: https://stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable. – jsanalytics

+0

@jstreet, ce n'est pas vraiment une copie de cela - OP demande un moyen efficace d'importer le CSV, pas * comment * importer un fichier CSV – DiskJunky

Répondre

0

Ceci est une solution testée-grande: < 5 secondes pour 85000 lignes

private void BulkSaveCsvData(DataTable dt, string destinationTableName) 
    { 
     using (var bulkCopy = new SqlBulkCopy(_dbConnecion, SqlBulkCopyOptions.Default)) 
     { 
      foreach (DataColumn col in dt.Columns) 
      { 
       bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
      } 
      bulkCopy.BulkCopyTimeout = 600; 
      bulkCopy.DestinationTableName = destinationTableName; 
      bulkCopy.WriteToServer(dt); 
     } 
    }