0

我有一个查询...

select
real_arrival_date-planned_delivery_date as days_late
from ifsapp.purchase_receipt_statistics

其中real_arrival_dateplanned_arrival_date是 类型 的列date。结果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在代码中的指定位置得到一个。为什么会发生这种情况,我该如何解决?

4

1 回答 1

1

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

ROUND()解决方法是使用 Oracle 的函数对数字进行四舍五入。像这样更改查询以将其四舍五入到小数点后两位:

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

然后,Oracle 客户端将能够成功地将值转换为小数,并且该函数将毫无问题地执行。

于 2015-01-27T17:22:41.490 回答