廃止された Microsoft プロバイダーではなく、Oracle の特定のデータ プロバイダー (11g) を使用しています。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 ステートメントにキャストして、NUMBER(18) のように Int64 に収まるようにします。
String strSQL = "SELECT CAST(DOCUMENT_SEQ.NEXTVAL AS NUMBER(18)) FROM DUAL";
(2) を行います。ドメイン タイプが Int32 または Int64 の場合、.NET Decimal に数値を正しく引き込めないと感じているからです。私が使用した他のプロバイダーは、オンザフライで変換を行うのに十分 (スマート) です。
ODP.NET の達人からの提案はありますか?