4

谁能告诉我为什么在为强类型 DataTable 中的列分配值时会出现 StrongTypingException?(我明白如果我要读取带有 DBNull 值的列,为什么会得到它)

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

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

3 回答 3

4

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:line 21680)表明它是从DataSet读取此属性的自动生成的方法引发的。由于您尚未使用SetdebcodeNull它,因此它不知道它为 null 并StrongTypingException在尝试读取它时抛出。

于 2013-03-12T15:14:58.737 回答
0

你可以试试这个:

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

虽然我承认这没有多大意义,但似乎调用Setfor newOrderRow.debcode 具有调用 的效果,Get如前所述,如果基础属性为 DbNull,则会引发异常。

于 2013-03-12T15:27:57.473 回答
0

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

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

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

于 2013-03-12T17:38:40.330 回答