【发布时间】:2020-02-09 08:48:26
【问题描述】:
我有一个已经创建的 DataView。我从现有的 DataView 构建了一个新的 DataTable,并将该数据作为 DataView 导出到 XlSX。我正在尝试检查最后一列是否具有大于 0 的整数。如果是,则应删除该行。由于这是两种不同的类型,一种是对象,另一种是双精度类型,所以并没有我想象的那么简单。
我已经在Operator '<' cannot be applied to operands of type 'object' and 'int'上查看了答案
在大多数情况下,这会完成,但是在某处它会返回一个 DBNull.Value,如所述。如果我尝试解析它似乎不喜欢它并且它不会构建。
private DataView CreateExhaustionDataView()
{
DataTable dt = BuildFufillmentDataTable();
DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
DataTable result = dv.ToTable(true,"Department","Date","Remaining");
var dr = result.NewRow();
if (Convert.ToDouble(dr["Remaining"]) >= 0.0)
{
dr.Delete();
}
DataView dvresult = new DataView(result);
return dvresult;
}
我在尝试转换时收到此错误消息:
System.InvalidCastException: '对象不能从 DBNull 转换为其他类型。' 我只在导出数据时收到此错误。 就解析而言,它根本没有构建。
如果我错过了任何提示或路线,我将不胜感激!
【问题讨论】:
-
1) 这不会编译:
if ( >= 0.0)。请提供将编译的代码。 2) 究竟是在哪一行抛出异常? -
我更新了代码,它只在 If 语句行出错。
-
在将
dr["Remaining"]传递给Convert.ToDouble() 之前,首先检查是否dr["Remaining"] == DBNull.Value。如果它等于 DBNull.Value,它是 null,你会得到这个异常。您不会从空值的数据库列中获得常规的null,只是那个特殊的常量。 -
嘿,等一下,您正在创建一个充满空值的新行并查看它。当然是空的。您想要结果中的第一行:
var firstrow = result.Rows.FirstOrDefault(),并检查firstrow是否为空。
标签: c# datatables dataview