首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataReader为数据库表浮动列返回不正确的.net数据类型

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

Stack Overflow用户
提问于 2019-04-24 08:26:41
回答 1查看 822关注 0票数 6

我在Oracle中有一个表,它包含一个column as FloatData reader应该按照这里给出的表返回Decimal for oracle float datatypehttps://learn.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings

但是问题是,datareader返回double as datatype for Float Column,如下所示:

但问题是,数据中心返回的数据类型为NREAL as FloatNFLOAT1 as float的两倍,而令人惊讶的是,datareader返回Decimal for both the column,如下所示:

代码:

代码语言:javascript
复制
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内部的一个bug,还是我做错了什么?

更新:基于评论的--我想提一下:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-25 03:45:24

FLOAT数据类型并不是这里的全部。SQL没有向您显示NFLOAT的精度小于50,而NREALNFLOAT1的精度为50或更高。在创建时未指定,精度默认为126,即浮动数据类型的最高精度

一个简单的测试查询将说明两者之间的区别:

代码语言:javascript
复制
SELECT CAST(0 AS FLOAT(49)), CAST(0 AS FLOAT(50)) FROM DUAL

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

在中,右键单击表并选择“Edit.”该对话框显示列的定义精度。

如果希望以NFLOAT的形式返回System.Decimal,请将精度提高到至少50。

我最近一直在整理文档并运行自己的测试。这是一个宠物项目,我不定期使用Oracle,所以有很多尝试和错误。DUMP函数在判断表达式中是否有正确的数据类型时非常有帮助,然后才能看到ODP .NET对它做了什么。

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

代码语言:javascript
复制
Type     Min p    Max p
---------------------------
Int16    1        4
Int32    5        9
Int64    10       18
Decimal  19       38

我本来希望ByteSBytep 1或2岁时返回,但这并没有成功。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55825566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档