검색하려고했지만, 비교적 간단한 것으로 대답을 찾지 못했습니다. 나는 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");
}
}
단일 열을 매핑 한 후 foreach에서 벗어나 동일한 오류가 발생하는지 확인하십시오. 그렇지 않으면 다른 열 중 하나가 제대로 매핑되지 않는 것처럼 보입니다. 예외를 검사하지 않는 한 항상 세부 정보를 제공하는 바이너리 검색을 수행 할 수 있습니다. –