InvalidCastException when 运行 查询 returns 一个数字

InvalidCastException when running a query that returns a number

我有一个问题...

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。为什么会发生这种情况,我该如何解决?

发生这种情况是因为在 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 客户端将能够成功将该值转换为小数,函数将毫无问题地执行。