6

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

但问题是 datareader 返回double as datatype如下Float Column所示:在此处输入图像描述

但问题是 datareader 返回 double 作为数据类型,NREAL as Float并且NFLOAT1 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还是我做错了什么?

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

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

4

1 回答 1

2

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

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

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

我希望Byte或者SByte会在p1 或 2 时返回,但没有成功。

于 2019-04-25T03:45:24.053 回答