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

Lea*_*sed 5 c# oracle ado.net oracle-sqldeveloper oracle.manageddataaccess

我在Oracle SQL Developer中有1个包含1的表column as FloatData reader应该Decimal for oracle float datatype按照此处给出的表返回:https : //docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/oracle-data-type-mappings

但问题是,DataReader的收益double as datatypeFloat Column如下图所示:在此处输入图片说明

但是问题是datareader返回的数据类型为double NREAL as FloatNFLOAT1 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);
                        }
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

我正在使用:Oracle.ManagedDataAccess.Client

这是里面的错误Oracle.ManagedDataAccess.Client library还是我做错了什么?

更新:根据评论,我想谈一谈:

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

mad*_*ion 3

数据FLOAT类型并不是这里的全部。SQL Developer 不会向您显示NFLOAT精度小于 50 的情况,NREAL而 和NFLOAT1的精度为 50 或更高的情况。创建时未指定,精度默认为 126,这是FLOAT 数据类型的最高可能精度

一个简单的测试查询将展示差异:

SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL
Run Code Online (Sandbox Code Playgroud)

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

在 SQL Developer 中,右键单击表并选择“编辑...”该对话框确实显示了列的定义精度。

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


我最近一直在梳理文档并运行自己的测试。这是一个我喜欢的项目,而且我不经常使用 Oracle,因此进行了很多尝试和错误。在查看 ODP .NET 对其执行的操作之前,该DUMP函数对于确定表达式中的数据类型是否正确非常有帮助。

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

Type     Min p    Max p
---------------------------
Int16    1        4
Int32    5        9
Int64    10       18
Decimal  19       38
Run Code Online (Sandbox Code Playgroud)

我希望ByteorSBytep在 1 或 2 时返回,但没有成功。