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