【问题标题】:Oracle .NET Data Provider and castingOracle .NET 数据提供程序和转换
【发布时间】: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 类型的任何表都有用。

标签: ado.net oracle11g odp.net


【解决方案1】:

这将适用于您的原始 SQL:

Int64 id = System.Convert.ToInt64(reader.GetValue(0));

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2018-07-09
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多