复制到数据表时,Int16的值太大或太小

时间:2012-01-05 07:17:59

标签: c# asp.net linq informix overflowexception

问:

以下代码:

        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。

2 个答案:

答案 0 :(得分:1)

我怀疑dtExternal short的{​​{1}}类型为emp_num,而dtEmployed有其他类型(intlong或者只是ushort) - 或者反之亦然。 CopyToDataTable只使用第一个包含它看到的第一行的表中的类型,然后遇到来自不同表的具有相同名称的列的值时遇到问题。来自the docs

  

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

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

编辑:我们不知道您填充两个原始DataTable的方法是什么样的 - 但您可能会发现首先创建DataTable,明确设置{{1}的类型<}>,然后然后填写表格,这没关系。

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

DataTable

答案 1 :(得分:1)

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