環境
ORACLE 10gEx
Vista Ultimate(x86) + vs2005(C#/VB) + VS2008も同様:
Data操作は単純なのが好きなので、ADO.NETでは、Adapterを使ってません。
DataTableの Loadメソッドに DataReaderが使えるので必要が無かったです。
更新も、自動生成されるSQLは使わずに、自前で生成するので、尚更、使うことがなく、スッキリ記述できてました。
OracleDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
なのに...
ROLLUP 関数を使うことになって、次のSQL文を発行したところ
select A_id , B_id , sum(gaku) from Uriage group by ROLLUP(A_id , b_id)
【制約を有効にできませんでした。行に入力できるのは、Null 以外の値、一意な値、あるいは外部キーですが、この制約の違反が 1 つ以上の行で発生しています。】
のメッセージが出て落ちました。落ちた場所は、 dt.Load(dr); の箇所です。
DB関係のメッセージは外れのことが多いので、悩みました。........皆目、見当が付かない。
しかたがないのて、Adapter()を使ってみると
OracleDataAdapter oda = new OracleDataAdapter(cmd);
DataTable dt = new DataTable();
oda.Fill(dt);
なんの問題もなく、実行できます。うーん、なんでだろう。
Adapter.Fill も内部では、DataReader=>DataTable と似たような処理をしていると思うのだが、的外れな例外が理解できない。
違う環境でテストしてないので、固有の現象か、一般的な現象かは不明ですが、 dt.Load(dr) と Adapter.fill() で、挙動が違うようなので、
Adapterを使わざるを得なくなりそう。なんかイヤだなぁ。