【发布时间】:2014-06-10 09:29:16
【问题描述】:
我正在使用 ODP.NET 执行查询。该查询从一个表中选择了很多列,包括几个 NUMBER(4) 列。
对本地 dev 10.2 实例执行查询时,所有 NUMBER(4) 列都作为 Int16 的实例返回。这没关系,也是意料之中的。
在对另一个 11.2 实例执行查询时,除了最后 NUMBER(4) 列之外的所有列也是 Int16 的实例,但最后一个是十进制的实例,这目前正在破坏我的代码。我可以在我的应用程序中解决这个问题,但它的任意性正在杀死我。这怎么可能? Is this even possible? 我的意思是,它是同一个查询,同一个表,所有列的类型相同,但其中一个在数据读取器中获得了不同的 C# 类型。怎么会这样?
EDIT -> 我正在运行测试。即使我从该单个表中仅选择该单个列,没有 JOIN 或 UNION 或 WHERE 或任何东西,也会出现问题。尝试删除列并重新创建它;同样的问题。尝试创建具有相同列的表的副本,问题不断发生。尝试使用 less 列创建表的副本,问题停止发生。是否可能仅由于表中行为不端的列的列数/位置而发生这种情况? (该表有 77 列,有问题的列是表中的最后一列)。
【问题讨论】:
-
你能提供一个可重现的测试用例吗?我倾向于认为一个问题列实际上不是
NUMBER(4,0)。 -
我仔细检查了类型;在 USER_TAB_COLS 中都有 DATA_TYPE = NUMBER,PRECISION = 4,DATA_SCALE = 0,DATA_LENGTH = 22。
-
我回想起以前使用 Oracle ODBC 驱动程序时的类似问题,其中一些列会返回为十进制。这通常发生在 UNION 语句中。您也可以尝试在行为不端的列上使用 CAST 函数将其强制为数字 (4,0)。