DataReader为数据库表float列返回不正确的.net数据类型

问题描述 投票:5回答:1

我在Oracle SQL Developer中有一个表包含1个qazxsw poi.qazxsw poi应该按照此处给出的表返回column as FloatData 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 Columnenter image description here的数据类型的两倍,令人惊讶的是datareader返回NREAL as Float,如下所示:

NFLOAT1 as float

代码:

Decimal for both the column

我正在使用:Oracle.ManagedDataAccess.Client

这是enter image description here内部的错误还是我做错了什么?

更新:根据评论,我想提一下:

虽然我可能引用了不适用于我正在使用的oracle库的不同源文档,但是我仍然得到其他2列的十进制数据类型,即NREAL和NFLOAT1,那么为什么这种行为不一致?

c# oracle ado.net oracle-sqldeveloper oracle.manageddataaccess
1个回答
1
投票

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,而FLOATNFLOAT的精度为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时返回,但是没有成功。

© www.soinside.com 2019 - 2024. All rights reserved.