- PR -

OracleCommandBuilderを使ってViewを更新

投稿者投稿内容
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-25 18:07
お世話になっております。

今回はOracleCommandBuilderを使ったViewの更新について質問があります。

現在、以下のような処理を行っています。

@テーブルからDatasetにデータを取得

ADatasetを更新

BCommandBuilderを使ってテーブルを更新


このとき、テーブルに対しては正常に処理が動くのですが、ビューに対してだとエラーが起きてしまいます。

エラーの内容は以下のようになっています。

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.


エラーはOracleDataAdapter.Updateコマンドを実行した時に起こります。

Viewには更新できないのでしょうか?

Viewを使って更新できるデータに制限をかけようとしているため、テーブルではなくViewを使う予定です。

おわかりになられる方がいらっしゃいましたらよろしくお願い致します。


(環境はVS.NET2003(SP2)、言語はVB.NETによるWindowsアプリケーションです。)
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-02-25 18:41
試していません。

OracleDataAdapter.UpdateCommandを手動で設定すれば更新できると思います。

エラーメッセージを読む限りは、Viewのときはキー情報が得られない(と思われる)
ので、動的な生成は無理そうです。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-25 20:17
そういう問題じゃないと思いますが(^^;
ビューって、何だと思いますか?
それが分かればエラーメッセージの意味も分かります。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-02-25 20:49
いや、view だからって更新が出来ないわけじゃないので…
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-25 21:16
そうなんですか…知らなかった
偉そうなこと言っちゃってすみません。失礼致しました。m(_ _)m
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-25 22:14
引用:

kanaiさんの書き込み (2005-02-25 18:41) より:
試していません。

OracleDataAdapter.UpdateCommandを手動で設定すれば更新できると思います。

エラーメッセージを読む限りは、Viewのときはキー情報が得られない(と思われる)
ので、動的な生成は無理そうです。


↑”kanaiさん”と同意見ですが、
UpdateCommandの中身を確認し、それが意図したものになっていますか?
SQLが実際どういうコマンドとして記述されるか?自分で記述できると思いますので、
それを比較しみてはどうですか?
ちなみにコマンド自動生成というものを過信してDB操作を行うとはまる可能性があります。
(パフォーマンスにも影響する可能性があります。。)
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-02-28 10:22
引用:

Viewを使って更新できるデータに制限をかけようとしているため、テーブルではなくViewを使う予定です。



データベースのViewの代わりに

「更新できる行に制限をかける」→DataViewで制限
「更新できる列に制限をかける」→DataSetで制限(DataGridでも可能かも)

とする方法もあります。

こうすれば、元はテーブルのままでよいので、CommandBuilderによる自動生成も
問題なく利用できると思います。
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-28 19:24
kanaiさん、ぼのぼのさん、にしざきさん、xxななおxxさんご返答ありがとうございます。

返信が遅くなってしまってすいませんでした。

UpdateCommandの中身を確認する方法が見つけられず、結局Updateコマンドを直書きすることで対処することにしました。

SQLPLUSでの処理は正常に実行されていたため、問題はないようです。

SQLPLUSで実行できるのにCommandBuilderを使用すると実行できないので疑問に思っていました。

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

そういった書き込みは今回のエラーが出た時に結構見かけたのですが、今からSQLの直書きに変更しようか悩んでいます。


VIEWを使用しないでDataView、DataSetの制限で管理する方法ですが、各パソコンごとに見れるデータに制限をかけようとしています。
そのため、見れるデータをログイン時のIDとPASSWORDで操作しようとViewを使用することになりました。
kanaiさんありがとうございました。

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