C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: oracle.dataaccess.clientについて


(過去ログ 113 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66808 / inTopicNo.1)  oracle.dataaccess.clientについて
  
□投稿者/ びぎなー (1回)-(2013/05/29(Wed) 09:51:46)

分類:[C#] 

今マスタ関連の画面を作っています。
基本は1テーブルで1画面の構造とし、データ更新等に関するクラスを作成し、
そこでデータベース操作の一元処理をしようと思っております。


データ抽出とデータ挿入に関しては特に問題はないのですが、データ更新とデータ削除で
つまずいていますので力を貸して下さい。

OracleDataAdapter.UpdateでフォームとバインドしたDataTableを渡しています。
共通クラスなので、クエリはできればそれぞれのマスタで明示的にコーディングするのでは
なく動的に作りたいと思っております。

OracleDataAdapterのUpdateCommandとDeleteCommandには
それぞれOracleCommandBuilderのGetUpdateCommand()とGetDeleteCommand()メソッドを
使って設定しています。

そこで、OracleDataAdapterのUpdateした際ににUpdate文とDelete文のWhere句をテーブルの
プライマリキーだけにしたいです。

なぜならばupdateメソッド前にDataTableに対して直接値の変更(更新日付等)を行った
場合に更新対象がないとエラーがでます。
その様なDataTableに直接値の変更を行わないならちゃんと更新してくれるみたいなのですが。。

色々調べたら、OracleCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges
としたら出来そうなのは分かったのですが、odp.netのほうではまだサポートされてないんですかね・・?
System.Data.OracleClientでは私の思ってた通りのSql文を発行してくれたのですが。。

もし、UpdateCommandを自前で書く必要があるのならば、DataTableのスキーマーから
判断してUpdate文とDelete文を作成する方法ってどのような考え方がありますか?


引用返信 編集キー/
■66813 / inTopicNo.2)  Re[1]: oracle.dataaccess.clientについて
□投稿者/ 魔界の仮面弁士 (228回)-(2013/05/29(Wed) 11:37:42)
No66808 (びぎなー さん) に返信
> oracle.dataaccess.clientについて
すべて小文字表記だと違和感が…。(^^;
(VBの質問であれば気にしないのですが)

> 色々調べたら、OracleCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges
> としたら出来そうなのは分かったのですが、odp.netのほうではまだサポートされてないんですかね・・?
最新版 で ConflictOption.OverwriteChanges がサポートされているかは
調査していませんが、少なくとも下記資料(ODP.NET 11.1.0.6.20)によれば、
指定しても NotSupportedException の例外になってしまうと記載されています。
http://docs.oracle.com/cd/E16635_01/win.111/e06104/OracleCommandBuilderClass.htm#CHDIGDAG

エラーにならないバージョンもあるようですが、それとて結局は
CompareAllSearchableValues の動作になってしまようですね。
http://blogs.wankuma.com/hatsune/archive/2009/04/24/172017.aspx


> もし、UpdateCommandを自前で書く必要があるのならば、DataTableのスキーマーから
> 判断してUpdate文とDelete文を作成する方法ってどのような考え方がありますか?
OracleDataReader r = selectCommand1.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly);
DataTable tbl = r.GetSchemaTable();
r.Close();
にして、DataTable から IsKey = true な物を拾い集めるとか。
引用返信 編集キー/
■66820 / inTopicNo.3)  Re[2]: oracle.dataaccess.clientについて
□投稿者/ びぎなー (2回)-(2013/05/29(Wed) 17:14:32)
No66813 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん。有難うございました。
やはり、ConflictOption.OverwriteChangesはサポートしてないのですね。。。
よく調べてみたら、ODP.NET11.2.0.3.2も同様にサポートしてない様でした。

UpdateCommandとDeleteCommandは自前で作る事にします。
有難うございました。

>>oracle.dataaccess.clientについて
> すべて小文字表記だと違和感が…。(^^;
> (VBの質問であれば気にしないのですが)
たしかにそうですね!数年ぶりにプログラムを組むとの
今回、C#を扱い始めたのが最近なんで慣れてませんでした。

助言を元にやってみたいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -