nam*_*ord 20 c# oracle datatable casting decimal
我似乎无法在谷歌(或StackOverflow)的任何地方找到这个问题,这真的让我感到惊讶,所以我把它放在这里以帮助处于同样情况的其他人.
我有一个SQL查询在Oracle Sql Developer上运行正常,但是当我通过C#使用它adapter.Fill(table)来获取结果时,我得到Specified cast is not valid错误(System.InvalidCastException).
这是C#代码的简化版本:
var resultsTable = new DataTable();
using (var adapter = new OracleDataAdapter(cmd))
{
var rows = adapter.Fill(resultsTable); // exception thrown here, but sql runs fine on Sql Dev
return resultsTable;
}
Run Code Online (Sandbox Code Playgroud)
这是SQL的简化版本:
SELECT acct_no, market_value/mv_total
FROM myTable
WHERE NVL(market_value, 0) != 0
AND NVL(mv_total, 0) != 0
Run Code Online (Sandbox Code Playgroud)
如果我删除了除法条款,它就不会出错 - 所以它是特定的.但是,market_value和mv_totalNumber都是Number(19,4)类型,我可以看到Oracle适配器需要一个小数,所以正在进行什么演员?为什么它适用于SqlDev但不适用于C#?
nam*_*ord 38
回答我自己的问题:
因此,似乎Oracle数字类型可以包含比C#十进制类型更多的小数位,并且如果Oracle尝试返回的内容超过C#可以保留,则会抛出InvalidCastException.
解?
在你的sql中,将任何可能有太多小数位的结果舍入到合理的位置.所以我这样做了:
SELECT acct_no, ROUND(market_value/mv_total, 8) -- rounding this division solves the problem
FROM myTable
WHERE NVL(market_value, 0) != 0
AND NVL(mv_total, 0) != 0
Run Code Online (Sandbox Code Playgroud)
它奏效了.
需要注意的是:Oracle数字类型与C#decimal之间不兼容.限制Oracle小数位以避免无效的强制转换异常.
希望这有助于其他人!
| 归档时间: |
|
| 查看次数: |
11541 次 |
| 最近记录: |