ASP.NET:複数結合テーブルのデータ変更方法についてこんにちはゲストさん。>>解決済みの質問ASP.NET:複数結合テーブルのデータ変更方法についてASP.NET:複数結合テーブルのデータ変更方法についてこんにちは。Stdの環境でデータベースを参照したWebアプリケーションを作成しています。GridViewを使い、データベースの内容を表示し、修正や追加、削除を行いたいと思っています。該当のテーブルを選択。その後「INSERT,UPDATEおよびDELETEステートメントの作成」オプションを選ぶことでこれらの変更方法が簡単に実装できるのを確認しております。主キー外部キーの関係を持つ2つ以上のテーブルを結合したものに関してこれらの変更を行う場合は通常どのようにするのでしょうか。何かヒントになるキーワードや参考になるコードを教えていただけないでしょうか?単独のテーブルの時と同じく、結合したテーブルデータ(ビューに該当)をGridViewに表示し、そのGridView上で変更を行いたいと思っています。Server側でこれらのテーブルを結合したViewを作成し、これを選ぶことでGridViewに表示する事が可能なのは確認したのですが、やはり「INSERT,UPDATEおよびDELETEステートメントの作成」オプションは選択できませんでした。以上よろしくお願いいたします。正規化データベースの結合テーブルを簡単・安全に一括更新することは、我々システムエンジニアにとって永遠のテーマであり、運用ニーズやパフォーマンスの点でさまざまな妥協にもとづき、わざと冗長化するなど、現実解に則って実装することが多いです。最近、Microsoftは、コンセプト、ツールの両面でこの問題に真正面から取り組んでおり、めざましく進歩しています。一般的に、ASP.NETでデータベースアクセスするには、いくつかの方法があります。Frameworkによるアクセス・その他、サードパーティー製品による複合的なアクセスです。これ以外には別解として、ストアドプロシージャを定義し、各スキームから呼び出す方法もあります。このうち、ご希望の「正規化されたデータベース」へ、結合テーブルのまま、SQLを書かずに更新するスキームは、最後の3つです。ご使用になっているスキームは、GridViewと同時期に発表されたSQLDataSourceだと思われますが、これは簡略なDBハンドリングをSQLレスで実現するために考えられたもので、結合テーブル更新は難しいです(デザイナの更新メソッドを全部オーバーライドすればもちろん可能ですが、それなら最初からSQLDataSOurceなど使わないでしょう)ObjectDataSource以前のスキームなら順次、個別更新するしかありません。LINQ以降であれば、結合エンティティのまま正規化されたDBを更新できます。ComponentOneなど、サードパーティ製の市販グリッドは、内部でデータアクセスモジュールを自動生成するので、LINQを使わなくても一括更新は可能です。現実の仕事では、それ以外の要素として悲観同時処理や長時間ロック、トランザクションなどが複雑になることがあるので、全部ストアドプロシージャに持ち込んでしまいます。SQLでいけると思います。いずれにせよ、SQLDataSourceなど使っていては拡張性も乏しく、先は見えています。19:46:45お礼ご回答いただきありがとうございます。>正規化データベースの結合テーブルを簡単・安全に一括更新することは、我々システムエンジニアにとって永遠のテーマであり、運用ニーズやパフォーマンスの点でさまざまな妥協にもとづき、わざと冗長化するなど、現実解に則って実装することが多いです。単テーブルしか扱った事がなかったので参考になります。Sourceをよく利用させていただいております。これは複雑なテーブルに対してあまり使えないのですね。Frameworkに関しましてはまだ扱った事がなくこれから勉強しようと思います。ObjectDataSourceも例でしか見た事がなく使った事がなかったのですが、例えば正規化されたA,Bというテーブルを結合しておいてGridViewの編集機能から一度にUpdateする時はその呼び出されるUpdate関数の中でupdate文をA,Bに対してそれぞれ行う(つまり2回)イメージで正しいでしょうか?>ただ現実の仕事では、それ以外の要素として悲観同時処理や長時間ロック、トランザクションなどが複雑になることがあるので、全部ストアドプロシージャに持ち込んでしまいます。いった事まで気が回っていなかったです。ストアドプロシージャについても調べてみます。DataSourceど同世代のサーバコントロールなので、これらと相性がいいといえばいいです。DataSourceのUpdate定義から、カスタムメソッドを呼び出し、その中で更新用のDataTableデータ(やDataRow)を生成して、TableAdapter.Update()で順次更新していくことになります。DataSourceは更新時、BindされているGridViewテンプレート内の入力サーバコントロールと同一プロパティ名を持っ、データコンテナオブジェクトを勝手に生成するので、その中の値を順次、DataRowなどに移していく必要があります。面倒ですが、ObjectDataSource使う場合のキモなので、頑張って実現してください。実戦で試してみたいと思います。ありがとうございました。(0)通報するANo.21050YEN>テーブルのメンテナンスは分割されているテーブル毎にやるのが一般的でしょうか?GridViewへの表示は、別にSQL文により結合された状態でもよいと思いますよ。更新ロジックを、しっかり自身で書き上げれば問題なく通ると思います。その発行単位が個別になるかどうかは、SQLの書き方にもよってくると思いますが、、、もっと情報を公開できませんか?ASP.NETがC#/VBのどっちで構成されているのかもわかりません。抜粋で結構ですが、公開する情報量が多いほど、参考となるサイトや、簡単なサンプルを提供できると思います。11:17:54お礼>ASP.NETがC#/VBのどっちで構成されているのかもわかりません。>抜粋で結構ですが、公開する情報量が多いほど、参考となるサイトや、簡単なサンプルを提供できると思います。データベースアプリケーション作成のスキルがない事もあり、実物はまだ設計段階でして具体例お出しできない状態です。一般的に、正規化により分割されている(しかし表示上結合する必要のある)テーブルの扱いをどうすればよいのかわからない為質問させていただきました。(表示はわかるのですが、更新追加などのメンテナンス部分。)もう少し形が見えてきましたら質問させていただきたく思います。ご回答いただきありがとうございました。(1)通報するANo.11050YEN>ADO.NET内部でUpdate,Insert,Deleteの時に発行しているのは、SQLサーバへのSQL文です。Studio」で発行できないSQL文はもちろん通りません。結合した時点でキーを失った場合、TableというよりViewです。「読み取り専用」となっていると思った方が良いです。・GridViewへのデータソースの設定方法などが公開されていれば、もっと詳細なアドバイスができると思いますが、今の方法では「無理です」としか言えません。16:32:57補足ご回答いただきありがとうございます。>「読み取り専用」となっていると思った方が良いです。>・結合するテーブルA・Bの構造とKeyと取得SQL文>・GridViewへのデータソースの設定方法テーブルに関してはまだ考えている途中ですが2つの場合を考えています。servernoサンプルテーブルのNorthwindのようなテーブル)の結合(2)元のテーブルとそのテーブル仕様変更などで項目を追加する為のテーブル(主キーは同じ)の結合((2)は分割して管理するのではなくて元のテーブル側に項目を追加する(元のテーブルを変更(追加)する)のがきっと普通なのでしょうね。すればテーブルひとつで済みますし。)どちらもユーザーに見せる場合テーブル結合した状態でGridViewを使い見せたいと思っています。メンテナンス(追加、削除、更新)する時もその結合した状態でのGridViewを使えたら良いなと考えていました。(1つのテーブルの時は実現できています。Serverのテーブル)選択)で設定しています。2008を使用しています。現在、ASP.NET(VB)にて開発を行っています。【ASP.NET】GridViewのヘッダを固定しつつ横スクロールもさせたいと考えています。