2013-03-12 47 views
3

任何人都可以告訴我爲什麼在將值賦值給強類型DataTable中的列時,爲什麼會出現StrongTypingException? (我明白爲什麼我得到它,如果我要讀取具有DBNull值的列)設置列值時的StrongTypingException

在下面的示例中,我試圖將一個DataTable中的值分配給另一個DataTable(示例中的所有列都是類型Int32)。我可以給'newOrderRow.items'列賦值,但是當我對'newOrderRow.debcode'列做同樣的操作時,拋出異常!爲什麼?!

一些到目前爲止我試過的東西(沒有任何的運氣):
- 分配硬編碼值,而不是「calclineRow.debcode」
- 分配另一個之前調用newOrderRow.SetdebcodeNull()值
- 將'orderrows'表中的'debcode'列的DefaultValue屬性從DBNull更改爲-1,並且它仍然拋出異常並且說它是DBNull!

myDataSet.orderrowsRow newOrderRow; 

foreach (MyDataSet.calclinesRow calclineRow in myDataSet.calclines) 
{ 
    newOrderRow = myDataSet.orderrows.NeworderrowsRow(); //Create new 'orderrows' row 

    //Assign values from one DataTable to another 
    if (!calclineRow.IsitemsNull()) 
     newOrderRow.items = calclineRow.items; //calclineRow.items == 1. Assignment successful 
    if (!calclineRow.IsdebcodeNull()) 
     newOrderRow.debcode = calclineRow.debcode; //calclineRow.debcode == 556. Assignment raises System.Data.StrongTypingException ! (See message below) 


    myDataSet.orderrows.AddorderrowsRow(newOrderRow); 
} 

/*Exception Message: 
===================== 

System.Data.StrongTypingException: The value for column 'debcode' in table 'orderrows' is DBNull. 
---> System.InvalidCastException: Specified cast is not valid. 
at MyProject.MyDataSet.orderrowsRow.get_debcode() in Q:\MyProjFolder\DataSets\MyDataSet.Designer.cs:line 21680 
*/ 

回答

0

已解決。對不起這是我的錯。

我忘記了我在DataTable的OnColumnChanging事件處理函數中使用了'debcode'列。當我禁用時,它一切正常。

無論如何,謝謝!

4

你必須使用自動生成的SetNull方法,如果可空屬性爲null:

if (!calclineRow.IsitemsNull()) 
    newOrderRow.items = calclineRow.items; 
else 
    newOrderRow.SetitemsNull(); 

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow.debcode = calclineRow.debcode; 
else 
    newOrderRow.SetdebcodeNull(); 

您也可以廣告新DataRow在環路的表,因爲NeworderrowsRow做到這一點不自動。

myDataSet.orderrows.AddNeworderrowsRow(newOrderRow); 

其中發生異常的線(MyDataSet.Designer.cs:線21680)表明,它從DataSet,其讀取該屬性的自動生成方法引發。由於您尚未使用SetdebcodeNull,因此它不知道它爲空,並在嘗試讀取它時拋出StrongTypingException

+0

不,那不是我的問題所在。問題是'calclineRow.debcode'不是DBNull。它的值爲556,但是當我嘗試將該值賦給'newOrderRow.debcode'時,程序抱怨'newOrderRow.debcode'是DBNull。 (當然這是,這就是爲什麼我試圖給它賦值!愚蠢的.NET!) – Kberg 2013-03-12 15:23:20

+0

爲什麼你總是在循環中重寫'newOrderRow'?不要「重複使用」外部變量,而是在循環中創建它。 'orderrows newOrderRow = myDataSet.orderrows.NeworderrowsRow();'我不確定這是否會導致問題。而且你必須在DataTable中添加新行,因爲NeworderrowsRow並不是隱含的。 – 2013-03-12 15:28:16

+0

我不確定我明白你的意思。增加了更多的代碼來澄清。無論如何,這與我們在此討論的實際問題並無多大關係。 – Kberg 2013-03-12 15:47:18

0

你可以試試這個:

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow["debcode"] = calclineRow.debcode; 

雖然我承認它沒有很大的意義,它看起來好像調用Set爲newOrderRow.debcode具有調用Get的效果,這是如果基礎屬性是DbNull,則會引發異常。

+0

試過了,沒有工作。 – Kberg 2013-03-12 16:45:08

+0

您應該檢查爲您的數據集生成的代碼。我想知道是否有奇怪的事情發生。 – 2013-03-12 16:54:33

+0

是的,我也這麼認爲。我甚至嘗試通過右鍵單擊VS2010中解決方案資源管理器中的.xsd文件並選擇'運行自定義工具'來重新構建它(但我不知道是否真的會重新生成DataSet後面的代碼?) – Kberg 2013-03-12 17:10:01