C# 我不小心投到了我背后的绳子上

C# 我不小心投到了我背后的绳子上,c#,C#,这最初是Crystal Reports的一个问题,但我将问题归结为一行代码: foreach (DataRow dr in ds.Tables["CurrentScheduleFields"].Rows) if (dr["MY_FIELD"].ToString() == string.Empty) dr["MY_FIELD"] = 0; 我正在使用Oracle数据库。该字段实际上是一个数字(2)。在这种情况下,我们使用的是直接的ADO.NET和不可为空的类型。在一种情况

这最初是Crystal Reports的一个问题,但我将问题归结为一行代码:

foreach (DataRow dr in ds.Tables["CurrentScheduleFields"].Rows)
    if (dr["MY_FIELD"].ToString() == string.Empty)
        dr["MY_FIELD"] = 0;
我正在使用Oracle数据库。该字段实际上是一个数字(2)。在这种情况下,我们使用的是直接的ADO.NET和不可为空的类型。在一种情况下,该字段的值为int,上面的代码行就可以了。另一种情况是,字段的值为DBNull.value,上面的代码或其他代码正在将0转换为“0”(字符串)

dr
不是`DataReader foreach(ds.Tables[“CurrentScheduleFields”].Rows中的DataRow dr)

有人知道为什么吗

我的浏览器不允许我点击添加评论,所以我在这里添加东西。如果(dr[“MY_FIELD”]==DBNull.Value),为什么我不能这样做 dr[“我的字段”]=0; 调试器点击该按钮并将其转换为值为“0”而不是“0”的字符串。我猜第一个答案解决了这个问题,“所以问题可能是第一个“MY_字段”为null,使ADO.NET相信该列的类型是字符串。”那么它现在是带有DBNull.Value的字符串

我的浏览器已锁定。我无法单击除编辑此之外的任何内容,但:
答:在晶体方面,通过改变公式来处理这个值的字符串,而不是整型。这很有效

在某些情况下,在处理DataTable时,我看到它试图根据集合中第一行的列中的值来“猜测”列的类型。因此,问题可能是第一个“MY_字段”为空,使ADO.NET确信该列的类型是字符串


在尝试加载数据表之前,您可能需要为其设置架构。

看起来
dr
是某种
DataReader
。@Sam:我认为这段代码不太可能将字段设置为“0”,除非Oracle自己进行转换。也许是这样?当你设置一个(有条件的)断点并检查变量时,调试器会说些什么?@Scrum-Meister:很明显,它实现了
IDataRecord
,可能还实现了
IDataReader
。如果它是
OracleDataReader
,我不会感到惊讶。如何验证该值是否转换为字符串?