DataReader 为数据库 table 浮点列返回不正确的 .net 数据类型

DataReader returning incorrect .net datatype for database table float column

我在 Oracle SQL 开发人员中有 1 个 Table,其中包含 1 个 column as FloatData reader 应该 return Decimal for oracle float datatype 根据table 此处给出:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings

但问题是数据读取器 returns double as datatype for Float Column 如下所示:

但问题是数据读取器 return 兼作 NREAL as FloatNFLOAT1 as float 的数据类型,令人惊讶的是 datareader returns 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 中的错误还是我做错了什么?

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

虽然我可能参考了不适用于我正在使用的 oracle 库的不同源文档,但我仍然为我的其他 2 列(即 NREAL 和 NFLOAT1)获取十进制数据类型,所以为什么这种行为不一致?

FLOAT 数据类型并不是这里的全部。 SQL 开发人员并未向您展示 NFLOAT 的精度小于 50,而 NREALNFLOAT1 的精度为 50 或更高。创建时未指定,精度默认为 126,即 the highest possible precision for the FLOAT data type.

一个简单的测试查询将证明差异:

SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL

第一列将返回为 System.Double。第二个将返回为 System.Decimal.

在 SQL Developer 中,右键单击 table 和 select "Edit..." 该对话框 确实 显示定义的列的精度。

如果您希望 NFLOAT 作为 System.Decimal 返回,请将精度至少提高到 50。


我最近一直在梳理文档和 运行 我自己的测试。这是一个宠物项目,我不经常使用 Oracle,所以有很多试验和错误。 DUMP 函数非常有助于在查看 ODP .NET 对其执行的操作之前确定表达式中的数据类型是否正确。

有关 ODP .NET returns 不同数据类型如何取决于精度的另一个示例,请考虑 NUMBER(p,0)

Type     Min p    Max p
---------------------------
Int16    1        4
Int32    5        9
Int64    10       18
Decimal  19       38

我希望当 p 为 1 或 2 时返回 ByteSByte 但没有成功。