SqlDataSource 对从 Oracle 中提取的数据抛出 "Specified cast is not valid" 错误

SqlDataSource throwing "Specified cast is not valid" error on data pulled from Oracle

这个从 Oracle 数据库中提取的 SqlDataSource 仅当我在 SQL 中包含 c.item_cost 时才会抛出 "Specified cast is not valid"。如果我删除此列,则不会出错。我是否实际在代码中引用该字段并不重要。

<asp:SqlDataSource ID="mySqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:myConnectionString %>" ProviderName="Oracle.ManagedDataAccess.Client" 
     SelectCommand="select msi.segment1 partnumber, 
                           msi.description, 
                           msi.primary_uom_code uom, 
                           c.item_cost
                    from apps.cst_item_costs c, apps.mtl_system_items_b msi, APPS.ORG_ORGANIZATION_DEFINITIONS org
                         and msi.organization_id=org.ORGANIZATION_ID
                         and c.organization_id=org.ORGANIZATION_ID
                         and c.cost_type_id=1 
                         and  ((msi.inventory_item_id=c.inventory_item_id) 
                         and (msi.organization_id=c.organization_id))  
                    order by msi.segment1">

此外,如果我将 SQL 添加到 trim 行数减少到一个小数字,则不会引发错误。我猜是列中的一些数据导致了这个问题。

SqlDataSource 是否对数据类型做了一些假设?

即使我可以查明数据,这些数据似乎都是有效的小数,如何避免这个错误?

如果需要更多信息,请告诉我。我目前正在尝试查明导致此问题的数据,但一切似乎都是有效的小数,尽管有些数字更多。 SQL 使用 TOAD 等数据库工具成功 运行。

更新: c.item_cost 中的值为 15.032221226116,比其他数据多得多。

这是一个涉及将 Oracle 数据类型转换为 .Net 类型的问题。 Entity Framework 3和4有类似的问题。如果您将 Oracle 类型指定为 Number(10),它会被解释为 .Net Float.

我怀疑这与 .Net 将 Oracle 数字转换为浮点数而不是小数时存在类似的问题。这个 answer 有更多的细节。

我建议尝试 ROUND(c.item_cost,12) 甚至 CAST(c.item_cost as DECIMAL(3,12)) as item_cost