[C#] SqlBulkCopy 일괄 추가 DataTable은 목록과 같은 순서여야 합니다. 그렇지 않으면 오류가 보고되고 자동 증분 열이 꺼집니다.

이전 기사에서 일괄 추가 작업을 테스트하고 일관된 추가에 실패했으며 최종 분석은 필드 열의 순서가 일치하지 않는다는 것입니다.

1. 일관되지 않은 열 이름

1.1 오류 메시지

디버깅 시 아래와 같은 오류 메시지가 지속적으로 떴다.데이터와 종류를 비교한 결과 문제가 발견되지 않았다.분석 후 첫 번째 열은 guid 문자열이고, 테이블의 첫 번째 필드는 자동 증가 ID가 있는 정수이다. , 이는 다음 프롬프트 메시지를 설명할 수 있음을 의미합니다.
데이터 소스에서 문자열 유형의 지정된 값을 지정된 대상 열의 유형 int로 변환할 수 없습니다.
여기에 이미지 설명 삽입

1.2 솔루션

SqlBulkCopy를 사용하여 DataTable을 일괄적으로 추가할 때 DataTable의 열이 데이터베이스 테이블의 열과 일치하는지 확인하는 것이 매우 중요합니다.

다음은 충족해야 하는 요구 사항입니다.

1) 열 이름 일치: DataTable의 열 이름은 데이터베이스 테이블의 열 이름과 일치해야 합니다. 열 이름의 대소문자 및 철자가 올바른지 확인하십시오.

2) 열 수: DataTable의 열 수는 데이터베이스 테이블의 열 수와 일치해야 합니다.

3) 데이터 유형 일치: DataTable에 있는 열의 데이터 유형은 데이터베이스 테이블에 있는 열의 데이터 유형과 일치해야 합니다. 데이터 유형이 호환되고 올바르게 변환될 수 있는지 확인하십시오.

DataTable의 열이 데이터베이스 테이블의 열과 일치하지 않으면 SqlBulkCopy 작업이 실패하거나 데이터 삽입 오류가 발생할 수 있습니다.

DataTable 열의 이름을 변경하려는 경우 매핑에 ColumnMapping을 사용할 수 있습니다.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    
    
    connection.Open();

    // 创建一个 DataTable 并填充数据
    DataTable dataTable = CreateDataTable();

    // 创建一个 SqlBulkCopy 对象
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
    
    
        bulkCopy.DestinationTableName = "YourDestinationTableName";

        // 映射 DataTable 的列到数据库表的列
        bulkCopy.ColumnMappings.Add("SourceColumn1", "DestinationColumn1");
        bulkCopy.ColumnMappings.Add("SourceColumn2", "DestinationColumn2");

        // 执行批量插入
        bulkCopy.WriteToServer(dataTable);
    }
}

이전 코드에서 DataTable 열의 이름을 대상 테이블의 열 이름에 매핑하여 매핑된 열의 수와 데이터 유형이 올바르게 일치하는지 확인합니다.

요약하자면 DataTable을 일괄적으로 성공적으로 추가하려면 DataTable의 열이 데이터베이스 테이블의 열과 일치하는지 확인해야 합니다. ColumnMappings는 열 이름이 일치하지 않을 때 작동하도록 열 이름을 매핑하는 데 사용할 수도 있습니다.

2. 자동 증분 열을 닫습니다.

DataTable 데이터를 일괄적으로 추가할 때 자체 증가 ID 열을 처리해야 하는 경우 다음 두 가지 일반적인 방법을 사용할 수 있습니다.

2.1, 열을 포함하지 않음

대상 테이블의 자체 증가 기능 비활성화:
대상 테이블의 ID 열에서 자체 증가 기능을 비활성화한 다음 SqlBulkCopy가 작동할 때 매핑에 원본 테이블의 ID 열을 포함하지 않습니다. 이러한 방식으로 데이터베이스 엔진은 각 행에 새 자동 증가 ID를 자동으로 할당합니다.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    
    
    connection.Open();

    // 创建一个 DataTable 并填充数据
    DataTable dataTable = CreateDataTable();

    // 创建一个 SqlBulkCopy 对象
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
    
    
        bulkCopy.DestinationTableName = "YourDestinationTableName";

        // 不包括源表的 ID 列在映射中
        bulkCopy.ColumnMappings.Add("Column1", "Column1");
        bulkCopy.ColumnMappings.Add("Column2", "Column2");

        // 执行批量插入
        bulkCopy.WriteToServer(dataTable);
    }
}

위 코드에서 원본 테이블의 ID 열은 SqlBulkCopy의 대상 테이블 ID 열로 매핑할 필요가 없다고 가정합니다. 데이터베이스 엔진은 대상 테이블에 대해 자동 증가 ID 값을 생성합니다.

2.2 기능 종료

DataTable에서 자동 증가 기능 끄기:
원본 테이블의 자동 증가 ID 열을 유지하고 대상 테이블에 삽입하지만 대상 테이블의 자동 증가 ID와 충돌하지 않으려면 다음을 설정할 수 있습니다. DataTable의 자동 증분 기능을 해제합니다.

// 创建一个 DataTable 并填充数据
DataTable dataTable = CreateDataTable();

// 关闭 ID 列的自增特性
dataTable.Columns["ID"].AutoIncrement = false;
dataTable.Columns["ID"].ReadOnly = true;

// 接下来使用 SqlBulkCopy 进行批量插入操作

ID 열의 자동 증분 기능을 해제한 후 SqlBulkCopy는 일괄 삽입 중에 ID 열을 처리하지 않지만 원본 테이블의 값에 따라 대상 테이블에 삽입합니다.

특정 요구 사항에 따라 자동 증가 ID 열 문제를 처리할 수 있는 적절한 방법을 선택해야 합니다. 대량 삽입에 SqlBulkCopy를 사용하는 경우 데이터베이스 테이블 구조와 원본 테이블의 데이터 형식과 열 이름이 동일한지 확인하고 열을 올바르게 매핑하여 데이터 삽입 문제를 방지하십시오.

추천

출처blog.csdn.net/lmy_520/article/details/131531250