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

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)将其检索为十进制数,并使用Int64的强制转换返回它(我不喜欢这种方法,因为十进制数太过复杂,至少我记得有一次阅读时它已经被弃用了...)

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";

我这么做是因为当我的域类型是Int32或Int64时,将一个数字转换为.NET Decimal并不干净。我使用过的其他提供程序很好(聪明),可以在运行时进行转换。

有没有ODP.NET大师有什么建议?


在ODP.NET中,所有的NUMBER类型都将被转换为Decimal类型。然后,您应该将其转换为适当的类型,如Int64(长整型)、Int16(短整型)等。在ORACLE中,关于NUMBER(n,p)类型和最佳.NET类型的任何表可能会很有用。 - Kiquenet
1个回答

3
这将适用于您的原始SQL:
Int64 id = System.Convert.ToInt64(reader.GetValue(0));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接