2013-07-10 3 views
1

검색하려고했지만, 비교적 간단한 것으로 대답을 찾지 못했습니다. 나는 CSV를 가지고 있는데, 그것은 데이터베이스 테이블에있는 모든 컬럼을 가지지 않을뿐만 아니라 자동 증가, CSV의 기본 키도 놓친다.SQLBulkCopy : 열 수에 차이가 있습니까?

내가 한 모든 것은 CSV를 DataSet으로 읽은 다음 전통적인 SQLBulkCopy 코드를 실행하여 데이터베이스 테이블의 첫 번째 테이블을 읽습니다. 대량 복사에 대한

The given ColumnMapping does not match up with any column in the source or destination.

내 코드는 내가 테스트하는 매핑을 추가

using (SqlBulkCopy blkcopy = new SqlBulkCopy(DBUtility.ConnectionString)) 
{ 

    blkcopy.EnableStreaming = true; 
    blkcopy.DestinationTableName = "Project_" + this.ProjectID.ToString() + "_Data"; 
    blkcopy.BatchSize = 100; 
    foreach (DataColumn c in ds.Tables[0].Columns) 
    { 
     blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName); 
    } 

    blkcopy.WriteToServer(ds.Tables[0]); 
    blkcopy.Close(); 
} 

이지만, 매핑 부분을 제거하는 차이를 만들하지 않습니다하지만 오류 다음 날을 제공합니다. 우리가 순서대로 열을 일치 시키려고하는 매핑을 제거하고 열의 수가 서로 다르므로 불일치 데이터 유형과 더 적은 열 값 등을 보냅니다. 오 예 예 CSV의 열 이름은 표의 것과 동일하며 같은 경우입니다.

편집 : 라이브 DB의 열 이름을 비교하도록 매핑 코드를 변경합니다. 이를 위해 단순히 데이터베이스 테이블에서 1 개 레코드를 가져 오기 위해 SQL 선택 쿼리를 실행 한 다음

foreach (DataColumn c in ds.Tables[0].Columns) 
{ 
    if (LiveDT.Columns.Contains(c.ColumnName)) 
    { 
     blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName); 
    } 
    else 
    { 
     log.WriteLine(c.ColumnName + " doesn't exists in final table"); 
    } 
} 
+0

단일 열을 매핑 한 후 foreach에서 벗어나 동일한 오류가 발생하는지 확인하십시오. 그렇지 않으면 다른 열 중 하나가 제대로 매핑되지 않는 것처럼 보입니다. 예외를 검사하지 않는 한 항상 세부 정보를 제공하는 바이너리 검색을 수행 할 수 있습니다. –

답변

1

내가 ... 스테이징 SQL 테이블에 CSV의 결과를 덤프하고 준비에서 간단하게 삽입 할 것 다음을 수행 생산 테이블에 테이블.

또한 CSV를 SQL 테이블로 가져 오면 CSV 파일 내에 일부 비어 있거나 잘못된 열이있을 수 있습니다.

+0

나는 당신의 제안을 따르기를 좋아하지만, 우리는 CSV에서 어떤 열을 얻었는지, 변할 수 있는지, 그리고 SQLBulkCopy가 누락 된 열 등을 읽거나 찾았을 때 그다지 확신 할 수는 없지만 나와는 그렇지 않다. 다른 생각이 있다면 내 새 편집을 봐? 그렇지 않다면 나는 당신의 길을 따라야 만합니다. –

+0

또한 여러 CSV를 읽어야합니다. 크기는 1GB 정도입니다. 병렬로 처리하고 있습니다. 각 테이블에 대해 새로운 테이블을 만드는 것은 좋지 않습니다. –

+0

제 제안은 단순한 것으로 시작해서 최소한 문제가 CSV 파일과 관련이 없는지 확인할 수 있습니다. 아마도 CSV 파일은 qoma (,)로 구분되어 있으며 텍스트 어딘가에 qoma가있어 어딘가에 포맷을 깨고 있습니다 가져 오기 내보내기 유틸리티를 사용하여 수동으로 SQL에 파일을 작성하면 좋은 아이디어를 얻을 수 있습니다. – highwingers

0

한 번이 문제가 발생했으며 원인은 열 이름의 경우에 차이가있었습니다. 열 중 하나는 "Id" 이었지만 DB에는 "id"이었습니다.