[C#] Adición por lotes de SqlBulkCopy Tenga en cuenta que DataTable debe estar en el mismo orden que la lista; de lo contrario, se informará un error y la columna de incremento automático se desactivará

En el artículo anterior, estaba probando una operación de adición por lotes y descubrí que la adición consistente no tuvo éxito. El análisis final fue que el orden de las columnas de campo era inconsistente.

1. Nombres de columnas inconsistentes

1.1 Mensaje de error

Durante la depuración, aparecía constantemente el siguiente mensaje de error. Después de comparar los datos y los tipos, no se encontraron problemas. Después del análisis, la primera columna es una cadena GUID y el primer campo de la tabla es un número entero con una identificación de incremento automático. , lo que significa Puede explicar el siguiente mensaje de solicitud: El
valor dado del tipo Cadena del origen de datos no se puede convertir al tipo int de la columna de destino especificada.
inserte la descripción de la imagen aquí

1.2 Solución

Al usar SqlBulkCopy para agregar tablas de datos en lotes, es muy importante asegurarse de que las columnas de la tabla de datos sean coherentes con las de la tabla de la base de datos.

Los siguientes son los requisitos que se deben cumplir:

1) Haga coincidir los nombres de las columnas: los nombres de las columnas en DataTable deben ser coherentes con los nombres de las columnas en la tabla de la base de datos. Asegúrese de que las mayúsculas y la ortografía de los nombres de las columnas sean correctas.

2) Número de columnas: el número de columnas en el DataTable debe ser consistente con el número de columnas en la tabla de la base de datos.

3) Coincidencia de tipos de datos: el tipo de datos de la columna en DataTable debe coincidir con el tipo de datos de la columna en la tabla de la base de datos. Asegúrese de que los tipos de datos sean compatibles y se puedan convertir correctamente.

Si las columnas de DataTable no coinciden con las columnas de la tabla de la base de datos, la operación SqlBulkCopy puede fallar o provocar errores de inserción de datos.

Si desea cambiar el nombre de la columna DataTable, puede usar ColumnMapping para la asignación.

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);
    }
}

En el código anterior, asigne los nombres de las columnas de DataTable a los nombres de columna de la tabla de destino, asegurándose de que el número y los tipos de datos de las columnas asignadas coincidan correctamente.

En resumen, para agregar con éxito DataTable en lotes, asegúrese de que las columnas de DataTable sean consistentes con las de la tabla de la base de datos. ColumnMappings también se puede usar para asignar nombres de columna para operar cuando los nombres de columna no son consistentes.

2. Cierre la columna de incremento automático

Al agregar datos de DataTable en lotes, si necesita lidiar con la columna de ID de incremento automático, puede tomar los siguientes dos métodos comunes:

2.1, no contiene columnas

Deshabilite la característica de incremento automático de la tabla de destino:
deshabilite la característica de incremento automático en la columna de ID de la tabla de destino y, a continuación, no incluya la columna de ID de la tabla de origen en la asignación cuando SqlBulkCopy funcione. De esta forma, el motor de la base de datos asignará automáticamente una nueva ID de incremento automático a cada fila.

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);
    }
}

En el código anterior, se supone que la columna de ID de la tabla de origen no necesita asignarse como la columna de ID de la tabla de destino en SqlBulkCopy. El motor de la base de datos genera valores de ID incrementados automáticamente para la tabla de destino.

2.2 Funciones cerradas

Desactive la función de incremento automático en DataTable:
si desea mantener la columna de ID de incremento automático de la tabla de origen e insertarla en la tabla de destino, pero evitar conflictos con la columna de ID de incremento automático de la tabla de destino, puede desactive la función de incremento automático en DataTable.

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

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

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

Después de desactivar la función de incremento automático de la columna de ID, SqlBulkCopy no procesará la columna de ID durante la inserción por lotes, sino que la insertará en la tabla de destino según el valor de la tabla de origen.

Debe elegir un método adecuado para resolver el problema de las columnas de ID de incremento automático de acuerdo con sus necesidades específicas. Tenga en cuenta que cuando use SqlBulkCopy para la inserción masiva, asegúrese de que la estructura de la tabla de la base de datos y la tabla de origen tengan los mismos tipos de datos y nombres de columna, y asigne las columnas correctamente para evitar problemas de inserción de datos.

Supongo que te gusta

Origin blog.csdn.net/lmy_520/article/details/131531250
Recomendado
Clasificación