我有一个查询...
select
real_arrival_date-planned_delivery_date as days_late
from ifsapp.purchase_receipt_statistics
其中real_arrival_date
和planned_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
。为什么会发生这种情况,我该如何解决?
答案 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客户端将能够成功地将值转换为小数,并且该函数将在没有问题的情况下执行。