我使用的是Oracle的特定数据提供程序(11g),而不是即将停用的Microsoft提供的提供程序。我发现ODP.NET对数据类型非常挑剔。JDBC和其他ADO提供程序只需转换数据类型,然后工作就完成了,但除非您完全正确地编写代码,否则ODP.NET将抛出无效转换异常。请看以下代码:
由于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大师有什么建议?