我使用 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 专家有什么建议吗?