尝试使用(decimal) OracleUdt.GetValue()
MDSYS.SDO_GEOMETRY(2001, 1041001,
MDSYS.SDO_POINT_TYPE(-2.89957214912471,1.56043985049899E-15,NULL),NULL,NULL)
根据Oracle documentation,这可能是因为其中一个十进制值超过了.NET的28位小数的精度范围。我们数据库中超出此精度限制的数据极为罕见,转换需要尽可能高效。
如果超过最大精度,优雅地截断结果,处理此异常的最佳选择是什么?
答案 0 :(得分:1)
VB.NET代码,未经测试,但是我使用了类似于oracleDecimal的东西。 转换为C#应该很容易。
OracleDecimal oraDec = MDSYS.SDO_GEOMETRY(2001, 1041001,
MDSYS.SDO_POINT_TYPE(-2.89957214912471,1.56043985049899E-15,NULL),NULL,NULL)
oraDec = OracleDecimal.SetPrecision(oraDec, 28) ' !!!
Decimal netDec = oraDec.Value
答案 1 :(得分:1)
参考@ AndrewR的回答,考虑以下测试:
[Test, Explicit]
public void OracleDecimal_NarrowingConversion_ShouldSucceed()
{
string sigfigs = "-9236717.7113439267890123456789012345678";
OracleDecimal od = new OracleDecimal(sigfigs);
OracleDecimal narrowedOd = OracleDecimal.SetPrecision(od, 28); //fails
//OracleDecimal narrowedOd = OracleDecimal.SetPrecision(od, 27); //succeeds
object narrowedObjectValue = (object)narrowedOd.Value;
Assert.IsInstanceOf<decimal>(narrowedObjectValue);
}
12c Providers的Oracle文档声明精度应介于1到38之间。(http://docs.oracle.com/cd/E51173_01/win.122/e17732/OracleDecimalStructure.htm#i1003600)。 .Net'十进制'文档说精度为28 - 29 sig figs。我不知道为什么28在这种情况下不起作用。
修改:如果您删除了“ - ”符号,则上述内容的有效数字为28位。