データベースプロバイダの差異

ADO.NETを使ってインタフェースベースで汎用的なコードを書いてもデータベース(プロバイダ)の違いにより動作しない(SQLのパラメータとか)ことがありますが、同一DB(例えばOracle)に対するOracleClientとODP.NETの違いってどの程度あるもの何でしょうか?

インタフェースベースでDB処理を書いていたので、試しにOracleClientからODP.NETに切り替えてみたら、例外が飛びまくりでした。例えば、number型のフィールドにアクセスするのに、

decimal no = (decimal) row["XXX"];

とか書いているとアウト。ODP.NETではdecimalではなくlongになっていたりと、何故、統一されていないか問い詰めたくなりました。(^^;
回避しようとするとキャストではなく、Convert.ToDecimalとかを使うことになりますが、VS上で生成された型付きデータセットとかは、思いっきりキャストしてくれているんですよね。この問題で今回はODP.NETに乗り換えるのは諦めたのでこれ以上調査していませんが、おそらく他にも色々あるでしょう。

相手が同じオラクルでもこんな状況なので、DB非依存なコードに憧れますが現実的には厳しいですね。