2012-01-05 119 views
2

问:值是太大或太小的Int16的,当拷贝到数据表

下面的代码:

 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值过大或太小。

+2

什么是'dtExternal'和'dtEmployed'?他们对'emp_num'列有什么类型? – 2012-01-05 07:20:52

+0

'DataTable dtExternal = Instructor.GetAllAssignedTeachersForImport(int.Parse(ddl_batch.SelectedValue),int.Parse(Session [“empnum”]。ToString())); DataTable dtEmployed ='Instructor.GetAllNominatedTeachersForImport(int.Parse(ddl_department.SelectedValue),int.Parse(ddl_study.SelectedValue));' – 2012-01-05 07:23:25

+1

每个结果数据表中的'emp_num'类型是什么? (只是告诉我们他们来自方法调用并不能真正给我们提供更多信息。) – 2012-01-05 07:27:06

回答

1

我怀疑dtExternalshort类型emp_num,而dtEmployed有一些其他类型的(intlong或者只是ushort) - 或者反之亦然。 CopyToDataTable只是使用第一个表中包含它所看到的第一行的类型,然后在遇到来自不同表的同名名称的列时遇到问题。从the docs

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

基本上:确保你的两个原始表具有相同的模式。

编辑:我们不知道你的方法来填充原来的两个DataTable看看像 - 但你可能会发现,通过先创建DataTable,明确设置的emp_num的类型,然后填充表,那会没事的。

你甚至可以离开你原来的方法独自一人,并建立一个新的DataTable用正确的模式,然后调用

dtInstTotal.CopyToDataTable(tableWithCorrectSchema, LoadOption.PreserveChanges); 
+0

是的,这个权利'dtEmployed' emp_num是小整数 但数据库管理员告诉我他不能更改数据类型.so请如何解决这个问题。 – 2012-01-05 07:29:02

+0

没有什么魔法可以申请。您不能“以编程方式修复它”,以使值103930适合16位整数。 – 2012-01-05 07:34:21

+0

我可以通过编程方式创建自己的数据表并将数据类型设置为int32吗? – 2012-01-05 07:36:12

1

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

相关问题