2012-01-05 227 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

相關問題