【问题标题】:DataReader returning incorrect .net datatype for database table float columnDataReader 为数据库表浮点列返回不正确的 .net 数据类型
【发布时间】:2019-04-24 08:26:41
【问题描述】:

我在 Oracle SQL Developer 中有 1 个表,其中包含 1 个 column as Float.Data reader 应该按照此处给出的表返回 Decimal for oracle float datatypehttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings

但问题是数据读取器为Float Column 返回double as datatype,如下所示:

但问题是 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);
                        }
                    }
                }
            }
        }

我正在使用:Oracle.ManagedDataAccess.Client

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

更新:基于 cmets 我想提一点:

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

【问题讨论】:

  • System.Data.OracleClient Oracle.ManagedDataAccess.Client 所以它可能有不同的绑定
  • 如果您使用的是Oracle.ManagedDataAccess,那么您正在查看错误的文档,因为您链接的是System.Data.OracleClient。试试docs.oracle.com/database/121/ODPNT/toc.htm
  • @Selvin 但对于其他列,即 NREAL 和 NFLOAT1,我得到的是十进制数据类型。那怎么样?
  • @Dirk 但是对于其他列,即 NREAL 和 NFLOAT1,我得到的是十进制数据类型。那怎么样?

标签: c# oracle ado.net oracle-sqldeveloper oracle.manageddataaccess


【解决方案1】:

FLOAT 数据类型并不是这里的全部内容。 SQL Developer 没有向您显示 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 中,右键单击表并选择“编辑...”该对话框确实显示了为列定义的精度。

如果您希望 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

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

【讨论】:

  • 赞成您为帮助我所做的努力以及您宝贵的时间和回答。根据此处显示的表格(docs.oracle.com/cd/B19306_01/win.102/b14306/appendixa.htm),float 似乎可以返回任何奇怪的东西
  • 不,该表并不是说那些是可以返回的类型,而是那些 .NET 类型的范围可以由相关的 Oracle 类型表示,反之亦然第二张桌子。对于FLOAT,ODP.NET 只会返回DoubleDecimal。我测试了FLOAT,精度为 1、49、50、126,以及其他几个围绕这些限制的精度以确认这一点。任何其他类型都需要强制转换或转换。
  • 好的。非常感谢。你的回答和评论真的很有帮助:)
  • 很高兴能帮上忙。你介意接受答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2016-03-20
相关资源
最近更新 更多