SqlBulkCopy批量插入多行失败,仅单行可正常执行
问题排查:SqlBulkCopy多行插入报错列映射不匹配
问题场景
在.NET 7环境下使用SqlBulkCopy将DataTable数据批量插入SQL Server时,仅单行数据可成功插入,多行时触发错误:
The given ColumnMapping does not match up with any column in the source or destination
已调整字段类型匹配数据库、手动添加列映射,但问题仍存在,更换不同数据行结果一致。
代码问题定位
问题出在批量插入代码的列映射逻辑:
当前代码遍历DataTable的每一行,并且为每一行都重复添加所有列的映射,导致SqlBulkCopy.ColumnMappings中存在大量重复的列映射条目。当只有单行时,映射仅添加一次,所以可以正常执行;多行时重复添加的映射会触发系统的列匹配校验错误。
修复方案
移除遍历行的循环,仅需遍历一次DataTable的列,添加一次列映射即可:
修复后的批量插入代码
var sb = new StringBuilder(); using var bulkCopy = new SqlBulkCopy(this.dbConnectionString); bulkCopy.DestinationTableName = table; // 仅遍历列一次,添加列映射 foreach (DataColumn c in data.Columns) { // 类字段名与数据库列名一致 bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName); } bulkCopy.WriteToServer(data);
额外检查点
- 确认
ToDataTable方法中生成的DataColumn列名与数据库表列名完全一致(注意拼写,SQL Server默认不区分大小写但需避免笔误) - 确认可空类型列的处理逻辑:若代码中
Map是自定义扩展方法,需验证其是否正确将可空类型转为对应底层类型并创建允许空值的列,示例参考:
// 示例Map扩展方法(若未实现) public static TResult Map<T, TResult>(this T source, Func<T, TResult> mapper) where T : class { return source != null ? mapper(source) : default; }
内容的提问来源于stack exchange,提问作者Simon Painter
相关产品推荐
相关产品推荐

