C# strong设置列值时的TypingException

C# strong设置列值时的TypingException,c#,.net,strongly-typed-dataset,C#,.net,Strongly Typed Dataset,有人能告诉我为什么在强类型数据表中为列赋值时会出现StrongTypingException吗?(我理解如果我读取带有DBNull值的列,为什么会得到它) 在下面的示例中,我试图将一个值从一个数据表分配给另一个数据表(示例中的所有列的类型都是Int32)。我可以为“newOrderRow.items”列赋值,但当我对“newOrderRow.debcode”列赋值时,会引发异常!为什么 到目前为止我尝试过的一些事情(没有任何运气): -指定硬编码值,而不是“calclineRow.debcode

有人能告诉我为什么在强类型数据表中为列赋值时会出现StrongTypingException吗?(我理解如果我读取带有DBNull值的列,为什么会得到它)

在下面的示例中,我试图将一个值从一个数据表分配给另一个数据表(示例中的所有列的类型都是Int32)。我可以为“newOrderRow.items”列赋值,但当我对“newOrderRow.debcode”列赋值时,会引发异常!为什么

到目前为止我尝试过的一些事情(没有任何运气):
-指定硬编码值,而不是“calclineRow.debcode”
-在分配另一个值之前调用newOrderRow.SetdebcodeNull()
-将“orderrows”表中“debcode”列上的DefaultValue属性从DBNull更改为-1,它仍然抛出异常并说它是DBNull


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

您可以尝试以下操作:

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow["debcode"] = calclineRow.debcode;
虽然我承认这没有多大意义,但似乎为newOrderRow.debcode调用
的效果是调用
Get
,如前所述,如果底层属性为DbNull,则会引发异常。

已解决。对不起,我的错

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


无论如何谢谢你

不,那不是我的问题所在。问题是“calclineRow.debcode”不是DBNull。它的值为556,但当我尝试将该值赋给“newOrderRow.debcode”时,程序抱怨“newOrderRow.debcode”为DBNull。(当然是这样,这就是为什么我要给它赋值!愚蠢的.NET!)为什么总是在循环中重写
newOrderRow
?不要“重用”外部变量,而是在循环中创建它<代码>orderrows newOrderRow=myDataSet.orderrows.NeworderrowsRow()我不确定这是否导致问题。您必须将新行添加到
数据表
,因为
NeworderrowsRow
并不意味着这一点。我不确定我是否理解您的意思。添加了更多的代码以进行澄清。无论如何,这与我们在这里讨论的实际问题没有多大关系。您可能应该检查为数据集生成的代码。我想知道是不是发生了什么奇怪的事。是的,我也这么认为。我甚至尝试在VS2010的解决方案资源管理器中右键单击.xsd文件并选择“运行自定义工具”(但我不知道这是否真的会重新生成数据集后面的代码?)
if (!calclineRow.IsdebcodeNull()) 
    newOrderRow["debcode"] = calclineRow.debcode;