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_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
。为什么会发生这种情况,我该如何解决?
发生这种情况是因为在 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 客户端将能够成功将该值转换为小数,函数将毫无问题地执行。
我有一个问题...
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
。为什么会发生这种情况,我该如何解决?
发生这种情况是因为在 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 客户端将能够成功将该值转换为小数,函数将毫无问题地执行。