2016-02-09 35 views
1

僅當我在SQL中包含c.item_cost時,從Oracle數據庫中提取的此SqlDataSource會引發「指定的強制轉換無效」。如果我刪除此列,則不會出現錯誤。如果我真的在代碼中引用該字段並不重要。SqlDataSource在從Oracle提取的數據上拋出「指定的強制轉換無效」錯誤

<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修剪的行數下降到一個小數目,不是拋出的錯誤。我猜這是導致問題的列中的一些數據。

SqlDataSource是否對數據類型做出了一些假設?

即使我可以精確定位數據,這似乎都是有效的小數,如何避免這個錯誤?

如果需要更多信息,請讓我知道。我目前正在試圖找出導致這種情況的數據,但一些似乎是有效的小數,儘管有些數字更多。 SQL可以成功運行諸如TOAD之類的數據庫工具。

更新:c.item_cost中的值是15.032221226116,它比其他數據的小數位數多得多。

+0

可能的類型從Oracle到.NET翻譯你真的需要所有價格的精確度? ROUND(c.item_cost,6)是否會拋出錯誤? – kevinsky

+0

@kevinsky它的工作原理。同時,我可以ROUND(c.item_cost,12),它仍然有效。不是我能夠繞多遠,但你讓我感動。寫下來,我會接受。 –

回答

1

這是一個涉及將Oracle數據類型轉換爲.Net類型的問題。實體框架3和4也有類似的問題。如果您將Oracle類型指定爲數字(10),則將其解釋爲.Net Float

我懷疑這是一個類似的問題.Net將Oracle編號轉換爲浮點數而不是小數。這answer有更多的細節。

我建議嘗試ROUND(c.item_cost,12),甚至CAST(c.item_cost十進制(3,12))作爲ITEM_COST

+0

是的,item_cost是一個'Number'類型 –

相關問題