我使用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大师的任何建议?
答案 0 :(得分:3)
这适用于原始SQL:
Int64 id = System.Convert.ToInt64(reader.GetValue(0));