映射数据类型 Oracle 和 C# 时出错
Posted
技术标签:
【中文标题】映射数据类型 Oracle 和 C# 时出错【英文标题】:Error mapping data type Oracle and C# 【发布时间】:2018-04-28 06:44:30 【问题描述】:我有一个带有ID NUMBER(18)
的表,我有一个带有public Int64 ID get; set;
属性的类来映射ID 形式C# 与Oracle。
我的表定义
但是当我得到这样的最大 ID 时出现错误:
运行查询
从 MYTABLE 中选择 MAX(ID) ID系统抛出错误:
“'System.Decimal' 类型的对象无法转换为 'System.Int64' 类型。”
但是当我像这样运行查询时:
从中选择 ID( 按 ID DESC 从 MYTABLE 订单中选择 ID ) 其中 ROWNUM =1没关系。
我不知道为什么(1)抛出错误,为什么(2)完成?
数据类型 (1) 和 (2) 有什么区别?
【问题讨论】:
@lad2025: 查询 1 和 2 返回相同的值,为什么 1 错误和 2 完成? 请发布您的表格定义。看起来列元数据有问题 【参考方案1】:可能的情况 1:
我猜你的表中有 NULL
值(所以你的两个查询不等价):
SELECT MAX(ID) ID FROM T_00_RQMM -- aggregate func ignore NULLS
但是:
SELECT ID FROM(SELECT ID FROM T_00_RQMM ORDER BY ID DESC) WHERE ROWNUM = 1;
-- NULL is the max value
DBFiddle Demo
无论如何你应该尝试映射:
using System.Numerics;
...
public BigInteger ID get; set;
编辑:
可能的情况 2:
可能是数据类型有问题(然后使用显式CAST
):
SELECT CAST(MAX(ID) AS NUMBER(18,0)) ID FROM T_00_RQMM
DBFiddle Demo 2
完整演示:
CREATE TABLE T_00_RQMM (ID NUMBER(18,0));
INSERT INTO T_00_RQMM VALUES(NULL);
INSERT INTO T_00_RQMM VALUES(100);
CREATE TABLE t1 AS SELECT MAX(ID) ID FROM T_00_RQMM;
CREATE TABLE t2 AS SELECT ID FROM(SELECT ID FROM T_00_RQMM ORDER BY ID DESC)
WHERE ROWNUM = 1;
CREATE TABLE t3 AS SELECT CAST(MAX(ID) AS NUMBER(18,0)) ID FROM T_00_RQMM;
SELECT TABLE_NAME, COLUMN_NAME, DATA_PRECISION, DATA_SCALE
FROM all_tab_cols
where table_name in ('T1', 'T2', 'T3')
ORDER BY Table_name;
输出:
+------------+-------------+----------------+------------+
| TABLE_NAME | COLUMN_NAME | DATA_PRECISION | DATA_SCALE |
+------------+-------------+----------------+------------+
| T1 | ID | null | null |
| T2 | ID | 18 | 0 |
| T3 | ID | 18 | 0 |
+------------+-------------+----------------+------------+
【讨论】:
不,我已经仔细检查过了,它不为空。查询 1 和 2 返回相同的值。但是不知道为什么 1 抛出错误 @HongVanVit 好的,当使用MAX
数据类型为NUMBER
而不是NUMBER(18)
时,它看起来像元数据问题以上是关于映射数据类型 Oracle 和 C# 时出错的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下使用 Oracle 数据库时,Hibernate 将布尔数据类型映射到啥?
C# winforms:将可空类型绑定到其他属性(不是文本)时出错
C#如何将xml数据转换成Array类型或者集合类?多谢!!!