我有一个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
无论如何,您应该尝试映射:
using System.Numerics;
...
public BigInteger ID { get; set; }
编辑:
可能的情况2:
数据类型可能有问题(然后使用显式CAST):
SELECT CAST(MAX(ID) AS NUMBER(18,0)) ID FROM T_00_RQMM
完整演示:
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)!