Oracle .NET数据提供程序和转换

时间:2010-03-23 23:10:11

标签: ado.net oracle11g odp.net

我使用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大师的任何建议?

1 个答案:

答案 0 :(得分:3)

这适用于原始SQL:

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