运行返回数字的查询时出现InvalidCastException

时间:2015-01-27 17:22:41

标签: c# odp.net odp.net-managed

我有一个查询...

select
real_arrival_date-planned_delivery_date as days_late
from ifsapp.purchase_receipt_statistics

其中real_arrival_dateplanned_arrival_datedate类型的列。生成的days_late将是一个十进制数字,表示我们的购买时间延迟了多少天。

我使用Oracle Managed Client在C#中执行此操作(虽然我怀疑常规的非托管ODP.NET客户端也会遇到此问题)。

var command = new OracleCommand("select real_arrival_date-planned_delivery_date as days_late from ifsapp.purchase_receipt_statistics");
var result = GetDataTable(command);

public static DataTable GetDataTable(OracleCommand command)
{
    DataTable dt = new DataTable();
    using (var connection = GetDefaultOracleConnection())
    {
        command.Connection = connection;
        connection.Open();
        dt.Load(command.ExecuteReader()); //InvalidCastException here
    }
    return dt;
}

我在代码中的指定位置获得InvalidCastException。为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:1)

这是因为在Oracle中减去两个日期列的结果可能有一个非常长的十进制数,例如:54.4514351851852。 Oracle客户端不准备将其转换为C#decimal,因此您可以获得InvalidCastException看起来相当简单的查询。

修复方法是使用Oracle的ROUND()函数将数字四舍五入。像这样更改查询将其四舍五入到小数位:

select
ROUND(real_arrival_date-planned_delivery_date, 2) as days_late
from ifsapp.purchase_receipt_statistics

然后,Oracle客户端将能够成功地将值转换为小数,并且该函数将在没有问题的情况下执行。