【发布时间】:2011-01-31 01:11:17
【问题描述】:
我使用 Oracle 的特定数据提供程序 (11g),而不是正在停止使用的 Microsoft 提供程序。我发现关于 ODP.NET 的一点是它对数据类型的挑剔程度。在 JDBC 和其他 ADO 提供程序只是转换并使其正常工作的情况下,ODP.NET 将抛出一个无效的强制转换异常,除非您完全正确。
考虑这段代码:
String strSQL = "SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL";
OracleCommand cmd = new OracleCommand(strSQL, conn);
reader = cmd.ExecuteReader();
if (reader != null && reader.Read()) {
Int64 id = reader.GetInt64(0);
return id;
}
由于 ODP.NET 对转换的挑剔,这不起作用。我通常的选择是:
1) 检索到 Decimal 并通过强制转换将其返回到 Int64(我不喜欢这样,因为 Decimal 太过分了,至少有一次我记得读过它已被弃用......)
Decimal id = reader.GetDecimal(0);
return (Int64)id;
2) 或者在 SQL 语句中进行强制转换以确保它适合 Int64,例如 NUMBER(18)
String strSQL = "SELECT CAST(DOCUMENT_SEQ.NEXTVAL AS NUMBER(18)) FROM DUAL";
我愿意 (2),因为当我的域类型是 Int32 或 Int64 时,我觉得将数字拉入 .NET Decimal 是不干净的。我使用的其他提供程序非常好(智能),可以即时进行转换。
ODP.NET 专家有什么建议吗?
【问题讨论】:
-
在 ODP.NET 中,所有 NUMBER 类型都将转换为 Decimal 类型。然后,您应该转换为适当的类型,如 Int64(长)、Int16(短)等。可能对 ORACLE 中有关 NUMBER(n,p) 类型和最佳 .NET 类型的任何表都有用。