2

问:

以下代码:

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

        dtInst = dtInstTotal.CopyToDataTable();//exception

抛出异常:

对于 Int16,值太大或太小。无法在 emp_num 列中存储 <103930>。预期类型是 Int16。---> System.OverflowException:对于 Int16,值太大或太小。

4

2 回答 2

1

我怀疑它dtExternal有一个short类型 for emp_num,而dtEmployed有一些其他类型(int或者long可能只是ushort) - 或者反之亦然。只使用包含它看到的第一行的第一个表中的类型,然后在遇到来自不同表的同名列CopyToDataTable的值时遇到问题。从文档

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

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

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

你甚至可以不理会你原来的方法,DataTable用正确的模式构建一个新的方法,然后调用

dtInstTotal.CopyToDataTable(tableWithCorrectSchema, LoadOption.PreserveChanges);
于 2012-01-05T07:22:45.867 回答
1

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

于 2012-01-05T07:31:11.373 回答