none
DataGridViewに、入力更新用テーブルと参照用マスタテーブルを表示する方法について RRS feed

  • 質問

  • お世話になります。

    DataGridViewに、入力更新用テーブル(仮にAテーブル)とマスタテーブル(仮に商品マスタ)の
    両方を表示させ、
    Aテーブルのみ更新及び追加を行い、
    Aテーブルの商品IDcombo boxにして選択した時に、DataSourceが連動して
    商品マスタの商品名を表示出来るようにしたいと考えております。

    DataGridViewにはAテーブルと商品マスタをクエリビルダーで下記のように
    作成したものをデータソースとしてバインドしてみましたが読み取り専用となり、
    Aテーブルには追加することが出来ませんでした。

    SELECT            Aテーブル.ID, Aテーブル.商品ID, 商品マスタ.商品名

    FROM              (Aテーブル LEFT OUTER JOIN

                            商品マスタ ON  Aテーブル.商品ID = 商品マスタ.商品ID)

    読み取り専用にならずにAテーブルへの入力更新と、商品マスタの商品名の参照が
    可能になる方法がありましたらお教えいただきたいと思っております。
    恐れ入りますがよろしくお願い致します。

    【環境】
    C#のバージョン:visual studio 2017
    ・接続データベース:Access2003 SP3

    2018年6月4日 5:33

回答

  • > クエリに追記致しましたが、追記した括弧書きのselect文にシングルコーテーションがついてしまいました。
    >‘(select 商品マスタ.商品名 from 商品マスタ where 商品マスタ.商品ID = Aテーブル.商品ID)’

    自分の環境(Windows 10 64-bit, VS2015 Community, Northwind 2007.accdb, ACE プロバイダ 32-bit)で試してみました。

    シングルコーテーションが付くということはなかったのですが、それよりも何よりもの問題として、クエリが動きませんでした。

    どうやら、JET や ACE データベースエンジンでは、単一バッチで複数のステートメントを実行できないということが理由のようです。

    Access のその問題を失念してました。結果的に間違った提案となってしまいすみません。

    SQL Server を使うか、紹介した 2 つの記事のもう一つの案(下記に URL 再掲)で行うしかなさそうです。

    DataGridView に ComboBox を表示
    http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

    Combobox 案なら上記の環境で動くことは確認しました。

    • 回答としてマーク sasatomo 2018年6月6日 4:50
    2018年6月5日 7:08
  • SelectCommand の内容は、現状どおり「SELECT … FROM [Aテーブル] LEFT OUTER JOIN [商品マスタ] ON …」にしておき、Insert/Delete/Update は自動生成に任せず、自前でクエリを書き換えておけばよいと思います。

    たとえば InsertCommand の内容は「INSERT INTO [Aテーブル] …」
    UpdateCommand の内容は「UPDATE [Aテーブル] SET …」
    DeleteCommand の内容は「DELETE FROM [Aテーブル] …」
    という風に。

    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 6:12
  • 不明点が多々あります。

    まずは、何を作っているか(Windows Forms アプリと想像してますが、想像しなくて済むようにきちんと書いてください)と、開発環境(OS, .NET のバージョンなど)を書いてください。

    そして、以下の点をクリアにしてください。

    > DataGridViewに、入力更新用テーブル(仮にAテーブル)とマスタテーブル(仮に商品マスタ)の両方を表示させ、Aテーブルのみ更新及び追加を行い、Aテーブルの商品IDをcombo boxにして選択した時に、DataSourceが連動して商品マスタの商品名を表示出来るようにしたいと考えております。

    上記の「Aテーブルの商品IDをcombo boxにして選択」という話と、

    > DataGridViewにはAテーブルと商品マスタをクエリビルダーで下記のように作成したものをデータソースとしてバインドしてみましたが読み取り専用となり、Aテーブルには追加することが出来ませんでした。

    > SELECT Aテーブル.ID, Aテーブル.商品ID, 商品マスタ.商品名 FROM (Aテーブル LEFT OUTER JOIN 商品マスタ ON  Aテーブル.商品ID = 商品マスタ.商品ID)

    とがどう結びつくのですか? 全然違う話に見えますけど?

    JOIN したクエリをベースに Visual Studio のデーターソース構成ウィザードで作った型付 DataSet + TableAdapter には追加・削除・更新のためのコードは一切生成されないのですが、そこを何とかしたいという話で、上の前者の話はとりあえず置いといていいのですか?

    A テーブルには商品 ID フィールドが含まれ、それと商品マスタテーブルの商品 ID フィールドに外部制約がかかっているということですか?

    上記の理解で良ければ以下の記事のようにしてやりたいことは可能だと思いますが、いかがですか?

    DataGridView に ComboBox を表示
    http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

    DataGridView に ID と名前を併記
    http://surferonwww.info/BlogEngine/post/2014/02/01/how-to-show-both-id-and-name-on-datagridview-while-enabling-update.aspx

    【追伸】

    質問にある SELECT クエリ、

    > SELECT Aテーブル.ID, Aテーブル.商品ID, 商品マスタ.商品名 ...

    を見ると、上に紹介した記事の後者の方が質問者さんのやりたいことに近いように思えますので、後者の記事を先に読んでください。

    • 編集済み SurferOnWww 2018年6月4日 6:50 追伸追記
    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 6:13
  • TableAdapterは、テーブルをjoinしたクエリ結果を更新できませんので、joinせずにサブクエリを使えば良いです。

    SELECT Aテーブル.ID,
           Aテーブル.商品ID,
           (select 商品マスタ.商品名 from 商品マスタ where 商品マスタ.商品ID = Aテーブル.商品ID) as 商品名
    FROM   Aテーブル


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 7:00
    モデレータ

すべての返信

  • SelectCommand の内容は、現状どおり「SELECT … FROM [Aテーブル] LEFT OUTER JOIN [商品マスタ] ON …」にしておき、Insert/Delete/Update は自動生成に任せず、自前でクエリを書き換えておけばよいと思います。

    たとえば InsertCommand の内容は「INSERT INTO [Aテーブル] …」
    UpdateCommand の内容は「UPDATE [Aテーブル] SET …」
    DeleteCommand の内容は「DELETE FROM [Aテーブル] …」
    という風に。

    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 6:12
  • 不明点が多々あります。

    まずは、何を作っているか(Windows Forms アプリと想像してますが、想像しなくて済むようにきちんと書いてください)と、開発環境(OS, .NET のバージョンなど)を書いてください。

    そして、以下の点をクリアにしてください。

    > DataGridViewに、入力更新用テーブル(仮にAテーブル)とマスタテーブル(仮に商品マスタ)の両方を表示させ、Aテーブルのみ更新及び追加を行い、Aテーブルの商品IDをcombo boxにして選択した時に、DataSourceが連動して商品マスタの商品名を表示出来るようにしたいと考えております。

    上記の「Aテーブルの商品IDをcombo boxにして選択」という話と、

    > DataGridViewにはAテーブルと商品マスタをクエリビルダーで下記のように作成したものをデータソースとしてバインドしてみましたが読み取り専用となり、Aテーブルには追加することが出来ませんでした。

    > SELECT Aテーブル.ID, Aテーブル.商品ID, 商品マスタ.商品名 FROM (Aテーブル LEFT OUTER JOIN 商品マスタ ON  Aテーブル.商品ID = 商品マスタ.商品ID)

    とがどう結びつくのですか? 全然違う話に見えますけど?

    JOIN したクエリをベースに Visual Studio のデーターソース構成ウィザードで作った型付 DataSet + TableAdapter には追加・削除・更新のためのコードは一切生成されないのですが、そこを何とかしたいという話で、上の前者の話はとりあえず置いといていいのですか?

    A テーブルには商品 ID フィールドが含まれ、それと商品マスタテーブルの商品 ID フィールドに外部制約がかかっているということですか?

    上記の理解で良ければ以下の記事のようにしてやりたいことは可能だと思いますが、いかがですか?

    DataGridView に ComboBox を表示
    http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

    DataGridView に ID と名前を併記
    http://surferonwww.info/BlogEngine/post/2014/02/01/how-to-show-both-id-and-name-on-datagridview-while-enabling-update.aspx

    【追伸】

    質問にある SELECT クエリ、

    > SELECT Aテーブル.ID, Aテーブル.商品ID, 商品マスタ.商品名 ...

    を見ると、上に紹介した記事の後者の方が質問者さんのやりたいことに近いように思えますので、後者の記事を先に読んでください。

    • 編集済み SurferOnWww 2018年6月4日 6:50 追伸追記
    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 6:13
  • TableAdapterは、テーブルをjoinしたクエリ結果を更新できませんので、joinせずにサブクエリを使えば良いです。

    SELECT Aテーブル.ID,
           Aテーブル.商品ID,
           (select 商品マスタ.商品名 from 商品マスタ where 商品マスタ.商品ID = Aテーブル.商品ID) as 商品名
    FROM   Aテーブル


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク sasatomo 2018年6月6日 4:51
    2018年6月4日 7:00
    モデレータ
  • SurferOnWww様

    情報が少なく、大変申し訳ありませんでした。

    【追記情報】
    ・作成しているもの:VisualC#のWindows Forms アプリ
    ・OS:Windows7
    ・.NET のバージョン: 4.7.02053

    となります。

    >「Aテーブルの商品IDをcombo boxにして選択」という話と、
    >読み取り専用になってしまう話しとがどう結びつくのですか? 
    >全然違う話に見えますけど?

    記載の仕方が悪く、大変申し訳ありませんでした。
    Aテーブルの商品IDをcombo boxにしてプルダウンさせて選択した時に、
    隣の列に商品マスタの商品名を表示出来るようにさせたいということが
    本来の目的になります。
    あらかじめAテーブルを基にして型付 DataSet + TableAdapterを
    作成しておりました。後から[構成]-[クエリビルダ]-[テーブルの追加]で
    「商品マスタ」を追加しリレーションをしていたのですが読取専用になりましたので、
    現在はAテーブル単一のDataSet + TableAdapterに戻しております。

    Access上は一対多のリレーションシップを行っており、
    「Aテーブルの全レコードと、商品マスタの同じ結合フィールドの
    レコードだけを含める」ようになっております。

    「DataGridView に ID と名前を併記」の記事のご紹介をありがとうございました。
    またアドバイスもありがとうございました。
    拝読させていただき、クエリに追記致しましたが、追記した括弧書きのselect文に
    シングルコーテーションがついてしまいました。
      
     ‘(select 商品マスタ.商品名 from 商品マスタ where 商品マスタ.商品ID = Aテーブル.商品ID)’

    問題点がどこなのか検証していたのですが、なかなか見つからず、
    大変恐れ入りますが悪いと思われる箇所をご指摘いただけたらと思います。
    お手数をおかけし申し訳ありませんがよろしくお願い致します。

    2018年6月5日 6:12
  • > クエリに追記致しましたが、追記した括弧書きのselect文にシングルコーテーションがついてしまいました。
    >‘(select 商品マスタ.商品名 from 商品マスタ where 商品マスタ.商品ID = Aテーブル.商品ID)’

    自分の環境(Windows 10 64-bit, VS2015 Community, Northwind 2007.accdb, ACE プロバイダ 32-bit)で試してみました。

    シングルコーテーションが付くということはなかったのですが、それよりも何よりもの問題として、クエリが動きませんでした。

    どうやら、JET や ACE データベースエンジンでは、単一バッチで複数のステートメントを実行できないということが理由のようです。

    Access のその問題を失念してました。結果的に間違った提案となってしまいすみません。

    SQL Server を使うか、紹介した 2 つの記事のもう一つの案(下記に URL 再掲)で行うしかなさそうです。

    DataGridView に ComboBox を表示
    http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

    Combobox 案なら上記の環境で動くことは確認しました。

    • 回答としてマーク sasatomo 2018年6月6日 4:50
    2018年6月5日 7:08
  • SurferOnWww様

    お忙しいところありがとうございました。
    「DataGridView に ComboBox を表示」のページも
    拝読させていただき、上手く動くことが出来ましたので
    こちらの方法で運用することに致しました。
    お手数をおかけし申し訳ありませんでした。
    詳細を調査して下さり本当にありがとうございました、
    感謝申し上げます。

    SQL Serverでの運用を検討していきたいのですが、
    現在の業務上での課題がAccess2003であるので
    差し当りはこのまま頑張りながら、SQL Serverの学習・運用に向けて
    少しずつ準備していきたいと思っております。
    ありがとうございました。

    2018年6月6日 4:50