3

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

4

1 回答 1

3

这将适用于您的原始 SQL:

Int64 id = System.Convert.ToInt64(reader.GetValue(0));
于 2010-03-24T19:59:13.110 回答