问:
以下代码:
var dtInstTotal = dtExternal.AsEnumerable()
.Union(dtEmployed.AsEnumerable())
.OrderBy(d => d.Field<string>("emp_name"));
dtInst = dtInstTotal.CopyToDataTable();//exception
抛出异常:
对于Int16,值太大或太小。不能存储 &LT; 103930&GT;在emp_num列中。预期类型是Int16。 ---&GT; System.OverflowException:值太大或太小 一个Int16。
答案 0 :(得分:1)
我怀疑dtExternal
short
的{{1}}类型为emp_num
,而dtEmployed
有其他类型(int
,long
或者只是ushort
) - 或者反之亦然。 CopyToDataTable
只使用第一个包含它看到的第一行的表中的类型,然后遇到来自不同表的具有相同名称的列的值时遇到问题。来自the docs:
目标表的模式基于源序列中第一个DataRow行的模式。表元数据是从DataRow元数据中提取的,表值来自DataRow的列值。
基本上:确保您的两个原始表具有相同的架构。
编辑:我们不知道您填充两个原始DataTable
的方法是什么样的 - 但您可能会发现首先创建DataTable
,明确设置{{1}的类型<}>,然后然后填写表格,这没关系。
您甚至可以单独保留原始方法,并使用正确的架构构建新的emp_num
,然后调用
DataTable
答案 1 :(得分:1)
我认为dtInst中的数据表结构或emp_num的dtInstTotal是int16
将其更改为int32