2015-01-27 3 views
0

У меня есть запрос ...InvalidCastException при выполнении запроса, который возвращает номер

select 
real_arrival_date-planned_delivery_date as days_late 
from ifsapp.purchase_receipt_statistics 

где real_arrival_date и planned_arrival_date столбцы типа date. Получившийся days_late будет десятичным числом, указывающим, сколько дней было поздно, наши покупки прибыли.

Я выполняю это на C# с помощью управляемого Oracle клиента (хотя я подозреваю, что у обычного неуправляемого клиента 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

Это происходит потому, что результаты вычитания двух столбцов даты в 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 сможет успешно преобразовать значение в десятичной системе, а функция будет выполняться без проблем.

Смежные вопросы