我在Oracle中有一个表,它包含一个column as Float。Data reader应该按照这里给出的表返回Decimal for oracle float datatype:https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings
但是问题是,datareader返回double as datatype for Float Column,如下所示:

但问题是,数据中心返回的数据类型为NREAL as Float和NFLOAT1 as float的两倍,而令人惊讶的是,datareader返回Decimal for both the column,如下所示:

代码:
static void Test()
{
using (OracleConnection connection = new OracleConnection("connection string")
{
connection.Open();
using (OracleCommand command = connection.CreateCommand())
{
command.CommandText = "select id , NFLOAT from Numeric_Table";
using (OracleDataReader reader = command.ExecuteReader())
{
for (int i = 0; i < reader.FieldCount; i++)
{
var columnName = reader.GetName(i);
var dotNetType = reader.GetFieldType(i);
var sqlType = reader.GetDataTypeName(i);
}
}
}
}
}我正在使用:Oracle.ManagedDataAccess.Client
这是Oracle.ManagedDataAccess.Client library内部的一个bug,还是我做错了什么?
更新:基于评论的--我想提一下:
虽然我可能引用了不适用于我所使用的oracle库的不同的源文档,但我仍然获得了其他2列的十进制数据类型,即NREAL和NFLOAT1,那么为什么这种行为是不一致的呢?
发布于 2019-04-25 03:45:24
FLOAT数据类型并不是这里的全部。SQL没有向您显示NFLOAT的精度小于50,而NREAL和NFLOAT1的精度为50或更高。在创建时未指定,精度默认为126,即浮动数据类型的最高精度。
一个简单的测试查询将说明两者之间的区别:
SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL第一列将作为System.Double返回。第二个将作为System.Decimal返回。
在中,右键单击表并选择“Edit.”该对话框显示列的定义精度。
如果希望以NFLOAT的形式返回System.Decimal,请将精度提高到至少50。
我最近一直在整理文档并运行自己的测试。这是一个宠物项目,我不定期使用Oracle,所以有很多尝试和错误。DUMP函数在判断表达式中是否有正确的数据类型时非常有帮助,然后才能看到ODP .NET对它做了什么。
关于ODP .NET如何根据精度返回不同数据类型的另一个示例,请考虑NUMBER(p,0)。
Type Min p Max p
---------------------------
Int16 1 4
Int32 5 9
Int64 10 18
Decimal 19 38我本来希望Byte或SByte在p 1或2岁时返回,但这并没有成功。
https://stackoverflow.com/questions/55825566
复制相似问题