DataReader 为数据库 table 浮点列返回不正确的 .net 数据类型
DataReader returning incorrect .net datatype for database table float column
我在 Oracle SQL 开发人员中有 1 个 Table,其中包含 1 个 column as Float
。Data 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 Float
和 NFLOAT1 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,而 NREAL
和 NFLOAT1
的精度为 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 时返回 Byte
或 SByte
但没有成功。
我在 Oracle SQL 开发人员中有 1 个 Table,其中包含 1 个 column as Float
。Data 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 Float
和 NFLOAT1 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,而 NREAL
和 NFLOAT1
的精度为 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 时返回 Byte
或 SByte
但没有成功。