Lea*_*sed 5 c# oracle ado.net oracle-sqldeveloper oracle.manageddataaccess
我在Oracle SQL Developer中有1个包含1的表column as Float。Data reader应该Decimal for oracle float datatype按照此处给出的表返回:https : //docs.microsoft.com/zh-cn/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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用:Oracle.ManagedDataAccess.Client
这是里面的错误Oracle.ManagedDataAccess.Client library还是我做错了什么?
更新:根据评论,我想谈一谈:
尽管我可能参考了不适用于我使用的oracle库的其他源文档,但是bt仍在获取其他2列(即NREAL和NFLOAT1)的十进制数据类型,为什么这种行为不一致?
数据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)
我希望ByteorSByte会p在 1 或 2 时返回,但没有成功。