当前位置:首页 > 数据库 > Oracle

错误映射数据类型Oracle和C#

我有一个ID为NUMBER(18)的表,并且有一个带有属性public Int64 ID的类.组;映射到C#与Oracle之间的ID映射.

我的表定义

但是当我获得最大ID时出现错误:

>运行查询

SELECT MAX(ID) ID FROM MYTABLE

系统抛出错误:

“Object of type ‘System.Decimal’ cannot be converted to type ‘System.Int64’.”

>但是当我运行这样的查询时:

SELECT ID FROM(
                SELECT ID FROM MYTABLE ORDER BY ID DESC
              ) WHERE ROWNUM =1

没关系.

我不知道为什么(1)抛出错误,为什么(2)出错?

数据类型(1)和(2)有什么区别?

解决方法:

可能的情况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          |
+------------+-------------+----------------+------------+

【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐