繁体   English   中英

设置列值时出现StrongTypingException

[英]StrongTypingException when setting column value

任何人都可以告诉我为什么在将值赋值给强类型DataTable中的列时会出现StrongTypingException? (我明白为什么如果我用DBNull值读取列,我会得到它)

在下面的示例中,我尝试将一个DataTable中的值分配给另一个(示例中的所有列都是Int32类型)。 我可以为'newOrderRow.items'列分配一个值,但是当我对'newOrderRow.debcode'列执行相同操作时,会抛出异常! 为什么?!

到目前为止我尝试过的一些事情(没有任何运气):
- 分配硬编码值而不是'calclineRow.debcode'
- 在分配另一个值之前调用newOrderRow.SetdebcodeNull()
- 将'orderrows'表中'debcode'列的DefaultValue属性从DBNull更改为-1, 并且STILL抛出异常并说它是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
*/

如果nullable属性为null,则必须使用自动生成的SetNull方法:

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因此它不知道它为null并在尝试读取时抛出StrongTypingException

你可以试试这个:

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

虽然我承认它没有多大意义,但似乎调用Set for newOrderRow.debcode具有调用Get的效果,如上所述,如果底层属性为DbNull则抛出异常。

解决了。 对不起这是我的错。

我忘记了我正在使用DataTable上的OnColumnChanging事件处理程序中的'debcode'列进行操作。 当我禁用它时它一切正常。

不管怎么说,还是要谢谢你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM