SSRS System.InvalidCastException - в OracleDataReader.GetDecimal (Int32 i) - PullRequest
0 голосов
/ 08 октября 2018

У меня есть отчет SSRS, который был указан на SQL Server views, который указал на Oracle tables.Я отредактировал набор данных отчета SSRS, чтобы запросить его непосредственно из базы данных Oracle.Это кажется очень простым изменением, пока я не получил это сообщение об ошибке:

System.InvalidCastException: Указанное приведение недействительно.

Со следующими подробностями...

Field ‘UOM_QTY’ и в нем также указано at Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i).

Оператор SELECT в этом поле довольно прост:

, (DELV_RECEIPT.INV_LBS/ITEM_UOM_XREF.CONV_TO_LBS) AS UOM_QTY

Кто-нибудь знаетчто вызвало бы сообщение и как устранить ошибку?Моя цель - использовать источник данных ORACLE вместо SQL SERVER.


Ошибка 1

Severity    Code    Description Project File    Line    Suppression State
Warning     [rsErrorReadingDataSetField] The dataset ‘dsIngredientCosts’ contains a definition for the Field ‘UOM_QTY’. The data extension returned an error during reading the field. System.InvalidCastException: Specified cast is not valid.
   at Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
   at Oracle.ManagedDataAccess.Client.OracleDataReader.GetValue(Int32 i)
   at Microsoft.ReportingServices.DataExtensions.DataReaderWrapper.GetValue(Int32 fieldIndex)
   at Microsoft.ReportingServices.DataExtensions.MappingDataReader.GetFieldValue(Int32 aliasIndex)      C:\Users\bl0040\Documents\Visual Studio 2015\Projects\SSRS\Project_ssrs2016\Subscription Reports\Feed Ingredient Weekly Price Avg.rdl   0   

Ошибка 2

Severity    Code    Description Project File    Line    Suppression State
Warning     [rsMissingFieldInDataSet] The dataset ‘dsIngredientCosts’ contains a definition for the Field ‘UOM_QTY’. This field is missing from the returned result set from the data source.       C:\Users\bl0040\Documents\Visual Studio 2015\Projects\SSRS\Project_ssrs2016\Subscription Reports\Feed Ingredient Weekly Price Avg.rdl   0   

Исходные таблицы:

+------------+---------------+-------------+---------------+-----------+
| Source     | TABLE_NAME    | COLUMN_NAME | DataSize      | COLUMN_ID |
+------------+---------------+-------------+---------------+-----------+
| ORACLE     | DELV_RECEIPT  | INV_LBS     | NUMBER (7,0)  | 66        |
+------------+---------------+-------------+---------------+-----------+
| ORACLE     | ITEM_UOM_XREF | CONV_TO_LBS | NUMBER (9,4)  | 3         |
+------------+---------------+-------------+---------------+-----------+
| SQL SERVER | DELV_RECEIPT  | INV_LBS     | numeric (7,0) | 66        |
+------------+---------------+-------------+---------------+-----------+
| SQL SERVER | ITEM_UOM_XREF | CONV_TO_LBS | numeric (9,4) | 3         |
+------------+---------------+-------------+---------------+-----------+

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вот способ исправить эту ошибку с помощью метода расширения вместо изменения SQL-запроса.

public static Decimal MyGetDecimal(this OracleDataReader reader, int i)
{
    try
    {
        return reader.GetDecimal(i);
    }
    catch (System.InvalidCastException)
    {
        Oracle.ManagedDataAccess.Types.OracleDecimal hlp = reader.GetOracleDecimal(i);
        Oracle.ManagedDataAccess.Types.OracleDecimal hlp2 = Oracle.ManagedDataAccess.Types.OracleDecimal.SetPrecision(hlp, 27);
        return hlp2.Value;
    }
}
0 голосов
/ 08 октября 2018

Ошибка исчезла после добавления оператора преобразования типа данных в выборку данных.

   , CAST(DELV_RECEIPT.INV_LBS/ITEM_UOM_XREF.CONV_TO_LBS AS NUMERIC(9,4)) AS UOM_QTY

Может ли кто-нибудь предоставить некоторую информацию о том, почему исходный запрос будет проблемой и почему CAST исправит эти ошибки?Я попытался привести результаты, потому что кто-то на форуме Code Project сказал ...

почему вы не используете типизированные наборы данных?Вы получаете такие головные боли только из-за не кодирования безопасным для типа способом.в IDE у вас есть дизайнер наборов данных, который делает жизнь лучше, безопаснее, проще, и вы ею не пользуетесь.Я действительно не могу понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...