我有一份指向SQL Server views
的SSRS报告,该报告指向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服务器。
错误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 |
+------------+---------------+-------------+---------------+-----------+
发布于 2018-10-09 02:16:06
将数据类型转换语句添加到数据选择后,错误消失。
, CAST(DELV_RECEIPT.INV_LBS/ITEM_UOM_XREF.CONV_TO_LBS AS NUMERIC(9,4)) AS UOM_QTY
谁能提供一些信息,说明为什么原始查询会出现问题,以及为什么CAST会修复这些错误?我试着预测结果是因为有人在Code Project forum上说...
为什么不使用类型化数据集?仅仅因为没有以类型安全的方式编码,你就会头疼。你在IDE中有一个数据集设计器,它可以让你的生活更好、更安全、更容易,但你并不使用它。我真的不明白。
发布于 2018-12-27 17:36:14
以下是使用扩展方法而不是修改SQL-Query来修复此错误的方法。
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;
}
}
发布于 2020-06-21 17:49:18
谢谢你,但是如果你的查询看起来像这样:
从x中选择x。*
而.GetDecimal却无处可寻?
在这种情况下有什么建议?我在ORACLE本身中创建了一个函数,该函数对结果集中的所有值进行舍入,以避免基本select语句出现这种情况,但对于加载可更新的数据集来说,这似乎是错误的……显然,这是一种获取数据的老式方法。
https://stackoverflow.com/questions/52707150
复制相似问题