我在Oracle SQL Developer中有一个表包含1个qazxsw poi.qazxsw poi应该按照此处给出的表返回column as Float
:Data reader
但问题是datareader为Decimal for oracle float datatype
返回https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings,如下所示:double as datatype
但问题是datareader返回Float Column
和的数据类型的两倍,令人惊讶的是datareader返回NREAL as Float
,如下所示:
NFLOAT1 as float
代码:
Decimal for both the column
我正在使用:Oracle.ManagedDataAccess.Client
更新:根据评论,我想提一下:
虽然我可能引用了不适用于我正在使用的oracle库的不同源文档,但是我仍然得到其他2列的十进制数据类型,即NREAL和NFLOAT1,那么为什么这种行为不一致?
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);
}
}
}
}
}
数据类型不是这里的全貌。 SQL Developer没有向您展示Oracle.ManagedDataAccess.Client library
的精度小于50,而FLOAT
和NFLOAT
的精度为50或更高。在创建时未指定,精度默认为126,即NREAL
。
一个简单的测试查询将证明差异:
NFLOAT1
第一列将作为the highest possible precision for the FLOAT data type返回。第二个将作为SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL
返回。
在SQL Developer中,右键单击表并选择“编辑...”该对话框确实显示了列的已定义精度。
如果你想要System.Double
返回,因为System.Decimal
将精度提高到至少50。
我最近一直在梳理文档并运行自己的测试。这是一个宠物项目,我不经常使用Oracle,所以有很多试验和错误。在查看ODP .NET对它做了什么之前,NFLOAT
函数非常有助于确定表达式中是否有正确的数据类型。
有关ODP .NET如何根据精度返回不同数据类型的另一个示例,请考虑System.Decimal
。
DUMP
我希望NUMBER(p,0)
或Type Min p Max p
---------------------------
Int16 1 4
Int32 5 9
Int64 10 18
Decimal 19 38
将在Byte
为1或2时返回,但是没有成功。