Skip to content
欢迎扫码关注公众号

SqlBulkCopy InvalidCastException

使用 SqlBulkCopy 类批量插入数据时报了如下错误:

System.InvalidCastException:Invalid cast from 'Int32' to 'DateTime'.

经调查当 DataTable 中列的顺序和实际数据库中列的顺序不一致时会出现该异常。

解决办法就是通过 SqlBulkCopy.ColumnMappings 属性指定 DataTable 和数据库中列的映射关系。

修改前代码

csharp
/// <summary>
/// 批量新增数据
/// </summary>
/// <param name="dt"></param>
/// <param name="dbContext"></param>
public void BulkAdd(DataTable dt, IDbContext dbContext)
{
    // 获取 fluent data 框架下的连接对象
    if (dbContext != null && dbContext.Data != null && (dbContext.Data.Connection is SqlConnection) && (dbContext.Data.Transaction is SqlTransaction))
    {
        SqlConnection conn = (SqlConnection)dbContext.Data.Connection;
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        SqlTransaction trsaction = (SqlTransaction)dbContext.Data.Transaction;
        SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trsaction);
        sqlbulkcopy.DestinationTableName = dt.TableName;
        sqlbulkcopy.WriteToServer(dt);
    }
}

修改后代码

csharp
/// <summary>
/// 批量新增数据
/// </summary>
/// <param name="dt"></param>
/// <param name="dbContext"></param>
public void BulkAdd(DataTable dt, IDbContext dbContext)
{
    // 获取 fluent data 框架下的连接对象
    if (dbContext != null && dbContext.Data != null && (dbContext.Data.Connection is SqlConnection) && (dbContext.Data.Transaction is SqlTransaction))
    {
        SqlConnection conn = (SqlConnection)dbContext.Data.Connection;
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        SqlTransaction trsaction = (SqlTransaction)dbContext.Data.Transaction;
        SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trsaction);
        sqlbulkcopy.DestinationTableName = dt.TableName;
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
        }
        sqlbulkcopy.WriteToServer(dt);
    }
}

参考文档

  1. SqlBulkCopy - The given ColumnMapping does not match up with any column in the source or destination.
  2. 单个批量复制操作
  3. SqlBulkCopy.ColumnMappings Property

Page Layout Max Width

Adjust the exact value of the page width of VitePress layout to adapt to different reading needs and screens.

Adjust the maximum width of the page layout
A ranged slider for user to choose and customize their desired width of the maximum width of the page layout can go.

Content Layout Max Width

Adjust the exact value of the document content width of VitePress layout to adapt to different reading needs and screens.

Adjust the maximum width of the content layout
A ranged slider for user to choose and customize their desired width of the maximum width of the content layout can go.