복붙노트

[SQL] 빠른 속도로 ADO.NET을위한 도서관은 .csv 파일에서 데이터베이스에 데이터를 삽입 일괄?

SQL

빠른 속도로 ADO.NET을위한 도서관은 .csv 파일에서 데이터베이스에 데이터를 삽입 일괄?

난 당신이 데이터베이스 작업을위한 모든 고급 ADO.NET 라이브러리를 추천 할 수 있는지 알고 싶습니다.

내가 LINQ - 투 - 엔티티 것은 아니지만 데이터베이스에 데이터를 삽입하기위한 모든 유용한에서, 데이터베이스에서 데이터를 당기에 좋은 것을 발견했습니다. 그것의 실종 빠른 대량 삽입 등의 기능 중복의 도태, 당신은 순수한 SQL로 달성 할 수있는 고급 기능을 대부분.

그래서 : 당신은 LINQ - 투 - 엔티티가 누락되는 고급 기능의 종류를 제공하는 일부 ADO.NET 라이브러리를 추천 할 수 있습니까?

해결법

  1. ==============================

    1.ADO.net SqlBulkCopy의 클래스는 테이블에 레코드를 빠르게 대량 업로드 할 수 있습니다 :

    ADO.net SqlBulkCopy의 클래스는 테이블에 레코드를 빠르게 대량 업로드 할 수 있습니다 :

        DataTable dt = s_EmptyUploadTable.Copy();
        foreach (var itm in yourList) {
            DataRow row = dt.NewRow();
            row["Field1"] = itm.Field1;
            row["Field2"] = itm.Field2;
            dt.Rows.Add(row);
        }
        using (SqlConnection cn = new SqlConnection(yourConnectionString)) {
            cn.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(cn)) {
                bulkCopy.DestinationTableName = "dbo.YourActualSQLServerTableName";
                bulkCopy.WriteToServer(dt);
            }
            cn.Close();
        }
    
  2. ==============================

    2.당신은 무대 뒤에서 SQL 대량 복사를 사용하여 데이터베이스를 IEnumerable 목록을 작성하는 LINQ 엔터티 데이터 판독기를 사용할 수 있습니다. LINQ 쿼리의 결과는 IEnumerable이기 때문에 당신은 대량이 라이브러리가 바로 데이터베이스로 LINQ 쿼리의 결과를 업로드 할 수 있습니다.

    당신은 무대 뒤에서 SQL 대량 복사를 사용하여 데이터베이스를 IEnumerable 목록을 작성하는 LINQ 엔터티 데이터 판독기를 사용할 수 있습니다. LINQ 쿼리의 결과는 IEnumerable이기 때문에 당신은 대량이 라이브러리가 바로 데이터베이스로 LINQ 쿼리의 결과를 업로드 할 수 있습니다.

    LINQ - 투 - 모든 어댑터가, 당신은 LINQ 쿼리를 사용하여 .csv 파일에서 데이터를 잡기 위해 사용하는 같은 트릭을 CSV 라이브러리에 LINQ를 할 수있는, 벌크 쓰기에 다음 LINQ 엔터티 데이터 판독기이 데이터를 직접에 데이터 베이스.

    사례 연구 :

    문제 : 데이터베이스에 신속하게 .csv 파일을 읽습니다. SQL 데이터베이스에 대한 연결이 LINQ - - Entitys에 C에서 #를 통해입니다.

    해결 방법 1 : CSV 라이브러리를 사용하여 LINQ는 다음 표준 LINQ - 투 - 엔티티 호출 (ctx.AddObject (), ctx.SaveChanges () 등)를 사용하여 그것을 쓰기, 원하는 데이터를 꺼내하는 LINQ 쿼리를 구축합니다. 시간 촬영 : 30 초 만 개 기록을 위해, LINQ는 모든 단일 레코드에 대한 쿼리를 생성 끝으로 (slooooow을 !!!!!).

    해결 방법 2 : CSV 라이브러리를 사용하여 LINQ는 대상 데이터 테이블에이 데이터를 직접 대량 쓰기에 IEnumerable을 사용 LINQ 엔터티 데이터 리더로 원하는 데이터를 꺼내하는 LINQ 쿼리를 구축합니다. 시간 촬영 : 3 초 만 개 기록을 위해.

    해결 방법 3 : 사용하여 SQL "대량 복사"에 저장 프로 시저. 시간 촬영 : 2 초 만 개 기록을 위해. 이 저장 프로 시저에 의존하고, SQL의 대량 복사가 좀 .csv 파일 형식과 호환되지 않습니다 그러나,이 솔루션은 매우 취성이다. 이 방법은 당신이 파일 포맷 문제 및 정상화에 도움을 처리하는 실제 목표 테이블과 .csv 파일 사이에 스테이징 테이블을 사용해야합니다.

    그리고, 여기에 솔루션 # 2에 대한 소스 코드는 다음과 같습니다

    static void WriteCSVtoSQLtable()
    {
      // Step 1: Read .csv file into IEnumerable using LINQ-to-CSV class.
    
      // This section requires "LINQtoCSV" class as described at http://www.codeproject.com/KB/linq/LINQtoCSV.asp
    
      string inputFilePath = @"T:\x.csv";
    
      CsvFileDescription inputFileDescription = new CsvFileDescription
      {
        SeparatorChar = ',',
        FirstLineHasColumnNames = true
      };
    
      IEnumerable<MyCustomColumnMappingClass> csvChains = cc.Read<MyCustomColumnMappingClass>(inputFilePath, inputFileDescription);
    
      // Step 2: Now write into the target table on SQL Server.
    
      // This section requires "EntityDataReader" class described at http://archive.msdn.microsoft.com/LinqEntityDataReader.
      public static string dbSqlConnectionString = @";Data Source=(local);Initial Catalog=PhiEngine;Integrated Security=True;MultipleActiveResultSets=True";
    
      SqlConnection dbSql(dbSqlConnectionString);
    
      using (var tran = dbSql.BeginTransaction())
      {
    
        var csvFile = from p in csvChains
                    select p;
    
        SqlBulkCopy bc = new SqlBulkCopy(dbSql,
          SqlBulkCopyOptions.CheckConstraints |
          SqlBulkCopyOptions.FireTriggers |
          SqlBulkCopyOptions.KeepNulls, tran)
                         {
                           BatchSize = 1000,
                           DestinationTableName = "TStagingTable" // Temporary staging table in database.
                         };
    
        bc.WriteToServer(csvFile.AsDataReader()); // Extension method .AsDataReader depends on adding the EntityDataReader class to your C# project (see above).
    
        tran.Commit();
      }
    }
    
    // This class is used by LINQ to CSV to query the .csv file, see "LINQtoCSV" website.
    public class MyCustomColumnMappingClass
    {
      [CsvColumn(Name = "symbol", FieldIndex = 1)]
      public string Symbol { get; set; }
    
      [CsvColumn(Name = "date", FieldIndex = 3, OutputFormat = @"MM/dd/yyyy")]
      public DateTime Date { get; set; }
    }
    
  3. from https://stackoverflow.com/questions/5052958/libraries-for-ado-net-to-rapidly-bulk-insert-data-into-a-database-from-a-csv-fi by cc-by-sa and MIT license