复制到数据表时,值对于 Int16 来说太大或太小

本文关键字:Int16 数据表 复制 | 更新日期: 2023-09-27 18:19:25

Q:

以下代码:

        var dtInstTotal = dtExternal.AsEnumerable()
                    .Union(dtEmployed.AsEnumerable())
                    .OrderBy(d => d.Field<string>("emp_name"));
        dtInst = dtInstTotal.CopyToDataTable();//exception

抛出异常:

值对于 Int16 来说太大或太小。无法存储 <103930>emp_num列中。 预期类型为 Int16。---> System.OverflowException:值太大或太小 一个 Int16。

复制到数据表时,值对于 Int16 来说太大或太小

我怀疑dtExternal有一个emp_numshort类型,而dtEmployed有其他类型(intlong或者只是ushort( - 反之亦然。 CopyToDataTable只使用包含它看到的第一行的第一个表中的类型,然后当它遇到来自不同表中具有相同名称的列的值时会遇到问题。从文档中:

目标表的架构基于源序列中第一个 DataRow 行的架构。表元数据是从数据行元数据中提取的,表值是从数据行的列值中提取的。

基本上:确保两个原始表具有相同的架构。

编辑:我们不知道您填充两个原始DataTable的方法是什么样子的 - 但您可能会发现,通过先创建DataTable,显式设置emp_num的类型,然后填充表格,那就可以了。

您甚至可以保留原始方法,并使用正确的架构构建一个新DataTable,然后调用

dtInstTotal.CopyToDataTable(tableWithCorrectSchema, LoadOption.PreserveChanges);

我认为 dtInst 或 dtInstTotal 中的数据表结构emp_num int16将其更改为int32