- PR -

OracleCommandBuilderを使ってViewを更新

投稿者投稿内容
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-03-01 09:50
CommandBuilder.GetUpdateCommand().ComanndText
Insert,deleteも同じようにあります。

コマンドの自動生成が完全な悪者だとは言い切れません。
ケースによって使い分けが必要なことがあるので自分でSQLやDBの知識をもって
CommandBuilderの仕様と照らし合わせた上で使用するという認識をもつようにする
ということです。

CommandBuilderは、ODP.NETのものを使用されているようですが、
ADO.NETのSqlCommandBuilderとほぼ仕様は同じです。↓
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDataSqlClientSqlCommandBuilderClassTopic.asp

もう参考にされてるかもしれませんが、こんなトピックとかもあります。↓
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18868&forum=7&3
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18290&forum=7&start=16&20
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-01 12:10
引用:

TAKAMIKIさんの書き込み (2005-02-28 19:24) より:
kanaiさん、ぼのぼのさん、にしざきさん、xxななおxxさんご返答ありがとうございます。


いやぁ、私はかなり恥ずかしい勘違い発言をしただけで
軽率な発言は控えようと激しく反省中です。

引用:

UpdateCommandの中身を確認する方法が見つけられず、
(中略)
コマンド自動生成はあまり使用しないほうがよいのでしょうか?
パフォーマンスが落ちるのですか?


http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

↑の第5回がかなり参考になります。お薦めです。
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-03-01 17:23
xxななおxxさん、ぼのぼのさんご返答ありがとうございます。

参照リンクまで教えてくださり本当にありがとうございました。

UpdateCommandの中身を見る方法がわかりました。

Dim OraDA As OracleAdaoter
Dim OCB As New OracleCommandBuilder(OraDA)
Dim OraUp As OracleCommand

OraUp = OCB.GetUpdateCommand

上記のコードでOraUpのCommandTextプロパティで確認することができました。

ただ、Viewに対しての更新箇所ではOraUpのところで同じエラーになってしまいました。

今回質問したところはコマンドビルダーを使用するのをやめたのですが、他のところでコマンドビルダーを引き続き使用しようとしています。

中身をよく確認し、使用していきたいと思います。

ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-01 20:41
引用:

コマンド自動生成はあまり使用しないほうがよいのでしょうか?
パフォーマンスが落ちるのですか?


 まず、仕様に関する問題から。

 対象のデータを、2人の人が同時に見ています。二人とも情報を書き換え、データベースへ書き出しました。さて、次に検索したとき、どちらの情報が取り出されるでしょうか?


 通常、後から実行した方が有効になります。でも、それでいいですか?二人が書き換えた情報が、同じカラムのデータならそれでもいいかもしれません。でも、違うカラムのデータを書き換えたらな、それはまずいですよね。その為、コマンド自動生成では、すべてのカラムが変更前と一致しているかどうかの確認をします。

UPDATE table SET column1 = data1 WHERE ID=id AND COLUMN2 = column2OldData AND ...

このため、インデックスが張られていない検索が発生し、パフォーマンスが落ちます。


 これらを避けるため、私はLastModifyという列を用意し、INSERT、UPDATEのトリガーでシステム日時を放り込むようにしています。こうするとLastModifyの列が一致しているか検査するだけで、他の人が書き換えていないかチェックできます。
 実際に誰かが書き換えた後にUPDATEなどをしようとすると、IDbCommand.ExecuteNonQueryメソッドを使う場合は戻り値が0になり、判定できます。DbDataAdapter.Updateメソッドを使った場合は、System.Data.DBConcurrencyExceptionが発生します。

_________________

スキルアップ/キャリアアップ(JOB@IT)