none
DataSet にて View を DataSource にした場合の TableAdapter.Update RRS feed

  • 質問

  • いつも参考にさせていただきありがとうございます。

    SQL Server にて、2つのテーブルからなる View を作成し
    その View を、VB2010 の DataSet に登録いたしました。

    プログラムの Load より上の部分(その領域の呼び名を忘れました)にて、

     Private ds As New [DataSet名]()
     Private TA As New [DataSet名]TableAdapters.[View名]TableAdapter()

    を記述し、アップデートボタンのプログラム記述欄に、

     ~中略~
     TA.Update(ds.[View名])

    としたところ、

     'Update' は '[DataSet名]TableAdapters.[View名]TableAdapter' の
     メンバーではありません。

    とエラーが出て怒られてしまいます。

    もしかしてデータセットに、View をデータソースとする場合は、
    Update できないのでしょうか?
    もしできるとすればその方法をご教示いただけませんでしょうか。
    どうかよろしくお願い申し上げます。

    2014年1月4日 3:25

すべての返信

  • > SQL Server にて、2つのテーブルからなる View を作成し
    > その View を、VB2010 の DataSet に登録いたしました。

    Visual Studio が自動生成する TableAdapter のソースコードを見てください。たぶん、Update メソッドを含め、更新関係のコードは一切生成されてないと思います。


    > もしかしてデータセットに、View をデータソースとする場合は、
    > Update できないのでしょうか?

    SQL Server DB の 2 つのテーブルから JOIN 句を用いてデータを抽出するような SELECT クエリをベースにして TableAdapter を作った場合、自動生成された TableAdapter のコードに更新関係のコードは含まれません。

    質問者さんの作ったビューをベースにした場合どうなるか分かりませんが、たぶん同じではないかと思います。とにかく自動生成された TableAdapter のソースコードを見てください。Update メソッドが含まれてなければ、当然ながら、Update はできません。


    > もしできるとすればその方法をご教示いただけませんでしょうか。

    更新のためのコードは、自力で TableAdapter を拡張するなどして対応する他ないです。例えば下記のサンプルのように。

    2 つのテーブルの同時更新
    http://surferonwww.info/BlogEngine/post/2010/08/21/Update-two-table-by-using-TableAdapter.aspx


    上記コードは階層更新は全く考えてないので注意してください。

    現状では、階層更新を実現する TableAdapterManager クラスも自動生成されていないと思いますが、これまで自力で実装しようとするのはかなり大変です。

    階層更新が必要なら、最初の方針から考え直して、全て Visual Studio の自動生成の機能に頼るようにした方がいいと思います。

    2014年1月4日 4:42
  • もしかしてデータセットに、View をデータソースとする場合は、
    Update できないのでしょうか?
    もしできるとすればその方法をご教示いただけませんでしょうか。

    TableAdapterがUpdateメソッドを自動生成するのは、一定の条件下のみです。例えば、テーブルをjoinしていたり、主キーが含まれていない場合は生成されません。そのTableAdapterのプロパティでUpdateCommandを見てみて下さい。おそらく(None)になっているはずです。
    #UpdateCommandに書かれたSQLでテーブルを更新します。

    さて、2つのテーブルからどのようなViewを作成されて、どのように更新されようとしていますか? 具体的なテーブル構造とViewを教えて下さい。また、どの列を更新するのかも教えて下さい。これらは全て仮名でかまいません。
    これによっていくつか代替案を提示できると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2014年1月4日 5:49
    モデレータ
  • trapemiya さん>

    > #UpdateCommandに書かれたSQLでテーブルを更新します。

    質問者さんの言われる TA.Update(ds.[View名]) の Update メソッドと、UpdateCommand に設定された UPDATE クエリで実行される操作は別物です。

    以下のページの図2を見てください。前者(質問者さんの言われる Update メソッド)は DataSet と DataAdapter の間の Update、後者は DataAdapter と SQL Server の間の Update になります。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    2014年1月4日 8:20
  • SurferOnWwwさん>

    どういう意図でUpdateCommandについて書かれたのか図れずにいます・・・。
    が、以下の記述は誤っていると思います。少なくとも図2にはTableAdapterは出てこないので、「前者(質問者さんの言われるUpdate メソッド)」は図2には載っていないですよね?

    >前者(質問者さんの言われる Update メソッド)は DataSet と DataAdapter の間の Update、
    >後者は DataAdapter と SQL Server の間の Update になります。

    TableAdapterは内部にDataSetおよびDataAdapterを内包しています。そして、TableAdapterのUpdateメソッドは、DataAdapterのUpdateメソッド、および、データベースに対する更新を行います。その更新の際に、UpdateCommand、InsertCommand、DeleteCommandにセットされているSQLを実行します。つまり、TableAdapterのUpdateメソッドは、上で引用した内容を全て行っています。

    よって、TableAdapterのUpdateメソッドにはUpdateCommandが必要であり、これらはセットで自動生成されます。つまり、自動生成に関して言えば、Updateメソッドが無ければUpdateCommandも無い(None)ということになりますし、その逆も成り立ちます(必要十分条件)。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年1月4日 13:02
    モデレータ
  • trapemiya さん>

    自分的には何を言っているんだろうって感じですが・・・


    > どういう意図でUpdateCommandについて書かれたのか図れずにいます・・・。

    質問者さんが TA.Update(ds.[View名]) の Update メソッドの質問をして、私が Update メソッドについて答えているのに、その後「UpdateCommandを見てみて下さい・・・UpdateCommandに書かれたSQLでテーブルを更新します。」と横レスしたのは trapemiya さんですよ。

    それがなければ、自分が UpdateCommand について書くことはありません。

    trapemiya さんが UpdateCommand を持ち出したので、誤解を招かないように、「質問者さんの言われる Update メソッドと trapemiya さんが見るように言われている UpdateCommand とは別物だ」と指摘したのです。


    > が、以下の記述は誤っていると思います。少なくとも図2にはTableAdapterは出てこないの
    > で、「前者(質問者さんの言われるUpdate メソッド)」は図2には載っていないですよね?

    誤ってないです。

    TableAdapter の中身は DataAdapter です。図2は、一般の DataAdapter に対しても、それを拡張した TableAdapter に対しても正しい説明です。

    質問者さんの言われる Update メソッドは、図2で DataSet と DataAdapter の間の Update メソッドと実質的に同じです。

    自動生成されたコードを見れば分かるはずですので、まずはそれを見てください。


    > よって、TableAdapterのUpdateメソッドにはUpdateCommandが必要であり、これらはセットで
    > 自動生成されます。

    そうでもないです。

    UPDATE 操作をしなければ UpdateCommand は不要です。実際、UpdateCommand の設定がない場合でも Update メソッドは生成できます。


    それはさておき、そもそも、

    > 'Update' は '[DataSet名]TableAdapters.[View名]TableAdapter' の
    > メンバーではありません。

    と言われたんですから、UpdateCommand ではなくて、Update メソッドに注目するのが正解だと思います。

    2014年1月5日 2:42
  • SurferOnWwwさん>

    >trapemiya さんが UpdateCommand を持ち出したので、誤解を招かないように、「質問者さんの言われる Update メソッドと trapemiya さんが見るように言われている UpdateCommand とは別物だ」と指摘したのです。

    このような初歩的なことは私は10年以上も前に学んでいますし、SurferOnWwwさんとは何度もやり取りをしていますが、私のレベルがこの程度であるとお考えであれば残念に思います。なので、なぜこのような私とSurferOnWwwさんにとってかなり初歩的なことを言われているのか図れなかったのです・・・。というか、TableAdapterのUpdateメソッドとSQLのUpdate文を普通、間違えますかね・・・?

    >質問者さんの言われる Update メソッドは、図2で DataSet と DataAdapter の間の Update メソッドと実質的に同じです。

    >自動生成されたコードを見れば分かるはずですので、まずはそれを見てください。

    それもよく知っています。何年も見てきています。私が先に引用した内容をもう一度引用します。

    >前者(質問者さんの言われる Update メソッド)は DataSet と DataAdapter の間の Update、
    >後者は DataAdapter と SQL Server の間の Update になります。

    このSurferOnWwwさんが書かれた日本語のどこにも実質的とはありません。TableAdapterのUpdateとDataSetとDataAdapterの間のUpdateはイコールと述べているように普通は受け取ると思います。ですから、私は誤りだと指摘しました。ただ、実質的にという言葉が入ればその通りだと思います。
    でもまぁ、こんな言葉遊びをしても仕方ないんですが。SurferOnWwwさんの言われたいことが今回、よくわかりました。ひょっとして、SurferOnWwwさんはTableAdapterのUpdateメソッドの質問なのに、DataAdapterのUpdateメソッドとうっかり取り違えているのかも?とも思っていましたが、そうではなかったですね。

    >そうでもないです。

    >UPDATE 操作をしなければ UpdateCommand は不要です。実際、UpdateCommand の設定がない場合でも Update メソッドは生成できます。

    実は今確かめられる環境にいないため、この部分には少々不安があったのですが、文章を訂正するのを忘れてしまいました。ごめんなさい。InsertCommandのみ自動生成される場合があるということですよね? 主キーが無い場合、そうなりましたっけ?
    確かにエラーで、UpdateCommnadを指定して下さいというメッセージを見た記憶がありますが、それがTableAdapterだったのか、DataAdapterだったのかはっきりしません・・・。TableAdapterであればUpdateメソッドは生成されているということですね。これについては明日、確かめたいと思います。

    >と言われたんですから、UpdateCommand ではなくて、Update メソッドに注目するのが正解だと思います。

    もう一度、私の書いた内容を引用します。

    >TableAdapterがUpdateメソッドを自動生成するのは、一定の条件下のみです。例えば、テーブルをjoinしていたり、主キーが含まれていない場合は生成されません。そのTableAdapterのプロパティでUpdateCommandを見てみて下さい。おそらく(None)になっているはずです。
    #UpdateCommandに書かれたSQLでテーブルを更新します。

    ここから、SurferOnWwwさんはTableAdapterのUpdateメソッドと、UpdateCommandで指定するSQLのUpdate文を私が同じだと思っていると思われ、指摘をされたということですね。ありがとうございます。しかし、私がUpdateCommandを持ち出した意図は以下のようなものです。

    UpdateメソッドはUpdateCommandプロパティを利用します。ですからそのUpdateCommandプロパティが(None)であれば、データベースを更新しようがありません。Updateメソッドに注目していないわけではありません。Updateメソッドが無いのはエラーメッセージから明らかです。質問者さんが「無かったです」と答えるのを待つまでもなく明らかです。参考として、UpdateCommandを見てみてくださいと書いただけです。Updateメソッドが無いのであれば、UpdateCommandプロパティが(None)のは明らかであり、その関係に着目して欲しかったのです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2014年1月5日 6:25
    モデレータ
  • >UPDATE 操作をしなければ UpdateCommand は不要です。実際、UpdateCommand の設定がない場合でも Update メソッドは生成できます。

    昨日言いましたように、先ほど確かめてみました。私の方でも再現させようと思って昼休憩中にいろいろ試してみたのですが、再現することができませんでした。どのような条件の元でUpdateCommandの設定が無いまま、Updateメソッドが生成されるのでしょうか? お手数をおかけしますが、ご教示をお願いいたします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年1月6日 4:10
    モデレータ
  • > TableAdapterのUpdateメソッドとSQLのUpdate文を普通、間違えますかね・・・?

    であれば、質問者さんやその他の閲覧者の方が見て誤解を生む余地がないような書き方をしていただければと思います。

    質問者さんが Update メソッドの質問をしているのに、モデレータとか MVP とかの肩書きを持った人が、

    > UpdateCommandを見てみて下さい。おそらく(None)になっているはずです。
    > #UpdateCommandに書かれたSQLでテーブルを更新します。

    と詳しい説明もなく書いたら、「Update メソッド」=「UpdateCommand」と誤解されても不思議はないと自分は思います。

    だから、別物だと知らない人が誤解しないように「別物だ」と書いたのです。

    後出しでいろいろ理由や説明を書かれていますが、そういうことは一番最初のレスに書くべきです。

    さらに、前の回答者の回答と違うことを書くなら、その理由も述べるべきと思います。今回のレスは、理由もなく前の回答を否定しているようにも見えます(はっきり言うと、マナー的にどうかと思います)。

    一般回答者とは違うモデレータ(調停者)ということですから、そのあたりも配慮いただければと思います。


    > どのような条件の元でUpdateCommandの設定が無いまま、Updateメソッドが生成されるのでしょうか?

    自分が試した限りですが、UpdateCommand 要素がない(InsertCommand 要素や DeleteCommand 要素はある)xsd ファイルから TableAdapter のソースを生成した場合です。

    簡単には、UpdateCommand 要素、InsertCommand 要素、DeleteCommand 要素がフルに定義されている xsd ファイルを Visual Studio 上で開いて、表示されている xxxTableAdapter をクリックし、プロパティウィンドウで UpdateCommand を (なし) に設定してやれば再現できるはずです。

    ちなみに、UpdateCommand, InsertCommand, DeleteCommand を全部 (なし) にしない限り、ソースコードから Update メソッドは消えないはずです。お試しください。


    • 編集済み SurferOnWww 2014年1月6日 8:20 一部追加
    2014年1月6日 8:16
  • SurferOnWwwさま
    trapemiya (MVP)さま

    いつも大変にお世話になっております。
    私のご質問に対して議論を重ねていただき本当に感謝申し上げます。

    お話しの腰を折るようで躊躇いたしましたが、もしかしたら私の質問の
    未熟な表現が問題を招いているかも知れませんので、質問に至るまでの
    過程をご説明させていただきます。

    =その1= データベースの作成

    1.SQL Server2008 Expressにて次のようなTableを2つ作成いたしました。

      テーブル名[M_ID_Pass]
       ・chk bit
       ・更新 bit
       ・分類Id char(3)
       ・職員コード varchar(5) not null Primary key
       ・職員名 nvarchar(30) not null
       ・職員名カナ nvarchar(30) not null
       ・パスワード varchar(8) not null

      テーブル名[M_分類]
       ・分類ID char(3) not null Primary key
       ・職種分類 nvarchar(10)

    2.この2つのテーブルを組み合わせて1つのビューを作成いたしました。

      ビュー名[v_ID_Pass_分類]
       ・M_ID_Pass.chk
       ・M_ID_Pass.更新
       ・M_ID_Pass.分類ID
       ・M_分類.職種分類
       ・M_ID_Pass.職員コード
       ・M_ID_Pass.職員名
         ・M_ID_Pass.職員名カナ
       ・M_ID_Pass.パスワード

       ・M_ID_Pass LEFT OUTER JOIN M_分類
        ON M_ID_Pass.分類ID = M_分類.分類ID

    その2に続きます。

    2014年1月6日 8:49
  • =その2= Visual Basic 2010 での操作

    1.Visual Basic の [データ]-[新しいデータソースの追加]にて
      SQL Server にて作成したビュー[v_ID_Pass_分類]を選択し
      [ID_PassSQLDataSet]に追加しました。

    2.frmPasswordSet.vb を作成して [DataGridView1] と [btn更新] を配置し、
      コード記入のスコープ欄に、
         Private ds As New ID_PassSQLDataSet()
         Private ta As New ID_PassSQLDataSetTableAdapters.v_ID_Pass_分類TableAdapter
      を記述しました。

    3.フォームの Loadイベント に、
      ~中略~
        ta.Fill(ds.v_ID_Pass_分類)
        DataGridView1.DataSource = ds.v_ID_Pass_分類
         DataGridView1.AutoSizeColumnsMode =
       DataGridViewAutoSizeColumnsMode.AllCells
      を記述し、

    4.更新ボタン[btn更新]のクリックイベントに
      ~中略~
       ta.Update(ds.v_ID_Pass_分類)
      ~中略~

    を記述したところ[エラー一覧]の箇所に、
     'Update' は 'ID_Pass.ID_PassSQLDataSetTableAdapters.v_ID_Pass_分類TableAdapter' の
     メンバーではありません。

    とエラー表示が出てしまった次第です。

    ちなみにプログラム中、エラーの波線が出ている部分は
    ta.Update の部分です。(ds.v_ID_Pass_分類)の部分には波線は出ていません。

    また、trapemiya さまのおっしゃる通り[UpdateCommand]には(none)と
    記述されておりました。いかがでらっしゃいますでしょうか。
    2014年1月6日 8:56
  • >と詳しい説明もなく書いたら、「Update メソッド」=「UpdateCommand」と誤解されても不思議はないと自分は思います。

    SurferOnWwwさんがそう思われるのであれば、歩みようがありません。お互い、それぞれの思いですので。
    「Update メソッド」=「UpdateCommand」と誤解されるようには私には思えません。名前も違いますし、メソッドとプロパティの違いもあります。

    >だから、別物だと知らない人が誤解しないように「別物だ」と書いたのです。

    冒頭に、「trapemiya さん>」と書かれていました。私宛のレスであり、私を諭すように「別物」だと書かれています。「別物だと知らない人」に対して言うのであれば、そのように書かれないとわかりません。私の間違いを指摘するのと、誤解を招かないように補足するのとでは全く違います。私は私宛のレスであると取ったので、それを前提にレスしました。

    >さらに、前の回答者の回答と違うことを書くなら、その理由も述べるべきと思います。今回のレスは、理由もなく前の回答を否定しているようにも見えます(はっきり言うと、マナー的にどうかと思います)。

    SurferOnWwwさんはUpdateメソッドの自動生成は無理で、TableAdapterを改造することを言われています。それはそれで間違っていないと思います。私は、あくまでUpdateメソッドの自動生成の可能性を探っています。回答は1つである必要はありません。どの回答が一番であるという競争をしているとは思っていません。できるだけ有意義な回答、情報が集まるようにと思っています。ですから、UpdateCommandも紹介しました。間違っていない回答を否定することはありませんし、間違っていても否定することはありません。間違いを指摘するだけです。人間ですから、間違いをするのは当たり前です。間違わずに成長する人はおそらくいません。間違った時に、どう感じて何を学ぶかだと思います。考え方一つです。嫌な気持ちだけで終わってはもったいないと思います。質問者も回答者も成長できるような場所になれば良いと思っています。ですから、他のアイディア、回答を持った人がいるのであれば、間違いを恐れず、忌憚なく書き込んでほしいと思っています。私は回答者としてこのフォーラムに参加することが多いですが、同時に何かを学びたいと思って参加しています。ですから、私の回答と違うことを書かれても私はありがたいと思います。(間違って恥ずかしい気持ちはありますが)
    というのが私の基本的なスタンスです。そのスタンスがSurferOnWwwさんを嫌な気持ちにさせ、配慮が足りなかったかもしれません。私も時間が無かったり、出先だったりで言葉足らずなところがあると思いますが、できるだけ気を付けたいと思います。ごめんなさい、ご理解下さい。

    >自分が試した限りですが、UpdateCommand 要素がない(InsertCommand 要素や DeleteCommand 要素はある)xsd ファイルから TableAdapter のソースを生成した場合です。

    了解しました。xsdファイルからはそのようになるということですね。勉強になりました。私はウィザードを使用した自動生成を前提にしていましたので、前提が違いますね。質問者さんがxsdファイルから生成しているのであれば、私はそこに気付いていなかったので誤ります。ごめんなさい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年1月6日 9:36
    モデレータ
  • > 私のご質問に対して議論を重ねていただき本当に感謝申し上げます。

    Update メソッドが自動生成されてないという点は同じ意見で、議論になっているところはその確認方法です。

    ソースコードを見て確認する方法がわからないということならその旨書いてください。

    さらに、どうしてもこの形でないとダメなのか(M_ID_Pass のみを扱うことに考え直す余地はないか)連絡ください。

    2014年1月6日 9:41
  • 追加情報です。

    M_ID_Pass のみを扱うのがダメで、どうしても 2 つのテーブルを同時に更新したいということであれば、JOIN したビューから作るのではなく、2 つのテーブルから別々に DataTable + TableAdapter を作って対応するという手もあります。

    具体例は以下のページを参考にしてください。

    10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
    http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/

    上記の例のようにすればほとんど自力でコードを書く必要はありませんし、TableAdapterManager を利用した階層更新も実現できます。


    注:
    階層更新とは、複数のテーブルで構成される DataSet が持つ更新データを、データベースの整合性に関する規則を守って、データベースに挿入、更新、削除するプロセスのことです。例えば、上記のチュートリアルで、新しい顧客から注文があった場合は、先に新しい顧客レコードを Customers テーブルに Insert してから、注文レコードを Orders テーブルに Insert しなければなりません。

    詳しい説明は以下の MSDN ライブラリを参照してください。

    階層更新
    http://msdn.microsoft.com/ja-jp/library/bb384468.aspx

    2014年1月7日 1:33
  • SQLの書き方を変えてみましたが、私の試す限り、ViewからはUpdateメソッドが作成されることはありませんでした。
    kei_chan_gtさんが提示された以下の内容を見ると、単に外部キーでマスターを参照しているだけのように思えます。

       ・M_ID_Pass.chk
       ・M_ID_Pass.更新
       ・M_ID_Pass.分類ID
       ・M_分類.職種分類
       ・M_ID_Pass.職員コード
       ・M_ID_Pass.職員名
         ・M_ID_Pass.職員名カナ
       ・M_ID_Pass.パスワード

       ・M_ID_Pass LEFT OUTER JOIN M_分類
        ON M_ID_Pass.分類ID = M_分類.分類ID

    もし、そうであれば、SQLを工夫することにより、Updateメソッドが生成されます。ただし、上に書きましたが、Viewを使うことはできませんので、今あるデータセットで、「追加」 → 「TableAdapter」 → 「SQLステートメントを使用する」で、以下のSQLを指定してTableAdapterを新たに作成してみて下さい。from句のテーブルは1つのみにし、joinで結合しないのがポイントです。

    select  t.chk, M_ID_Pass.更新,t.分類ID, t.職員コード,  t.職員名, t.職員名カナ, t.パスワード,
              (select 分類.職種分類 from M_分類 分類 where 分類.分類ID = t.分類ID) 職種分類
    from M_ID_Pass t

    >また、trapemiya さまのおっしゃる通り[UpdateCommand]には(none)と
    記述されておりました。いかがでらっしゃいますでしょうか。

    データベースが正しく更新されるためには、TableAdapterのUpdateメソッド、およびInsertCommand, DeleteCommand, UpdateCommandが必要です。もし、Updateメソッドが存在するにもかかわらず、更新されない場合には、これらをチェックしてみて下さい。
    #先程、テストしている時に、InsertCommandのみ生成される場合に遭遇しました。もちろん、Updateメソッドも生成されています。どうやら、データベースにおけるテーブルに主キーが無い場合は、InsertCommandのみ生成されるようです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年1月7日 4:48
    モデレータ
  • SurferOnWwwさま
    trapemiya (MVP)さま

    おはようございます。
    ご回答が遅くなり申し訳ございませんでした。
    自分なりの進展をご回答できるまで試行錯誤しておりました。

    おふたかたのアドバイスを基に再構築してみました。

    1.SQL Server にて作成したビュー[v_ID_Pass_分類]の
      [ID_PassSQLDataSet]への追加は削除し、

    2.SQL Servderのテーブル名[M_ID_Pass]をデータソースにした
      [M_ID_Pass]データテーブルと

      SQL Servderのテーブル名[M_分類]をデータソースにした
      [M_分類]データテーブルを

      [ID_PassSQLDataSet]へそれぞれ追加いたしました。

    3.既に作成してある frmPasswordSet.vb のデザイン画面に
      データソース欄から次の物をドラッグ&ドロップして来ました。

      [ID_PassSQLDataSet]
        │
        └─[M_分類]
            │
            └─[M_ID_Pass]

      すると[M_ID_PassBindingSource]をデータソースとした
      データグリッドビューが自動的に作成され、フォームの
      デザイン画面下部には次のオブジェクトが配置されました。

      [ID_PassSQLDataSet]
      [M_ID_PassBindingSource]
      [M_ID_PassTableAdapter]
      [M_分類BindingSourc]
      [M_分類TableAdapter]
      [TableAdapterManager]

    4.新規に自動作成されたデータグリッドビュー[DataGridView1]
      にて[列の編集]を選択し、[分類ID]のColumnTypeを
      [DataGridViewComboBoxColumn]に変更しました。

    5.コンボボックスに変更した[分類ID]列を次のように設定しました。

      [DataPropertyName] 分類ID
      [DataSource]    M_分類BindingSource
      [DisplayMeber]   職種分類
      [ValueMember]    分類ID

    6.フォームの Loadイベント に、
      ~中略~
      M_分類TableAdapter.Fill(ID_PassSQLDataSet.M_分類)
      M_ID_PassTableAdapter.Fill(ID_PassSQLDataSet.M_ID_Pass)

    7.フォームの [更新ボタン]クリックイベントに、
      ~中略~
      DataGridView1.EndEdit()
      M_ID_PassTableAdapter.Update(ID_PassSQLDataSet.M_ID_Pass)

    としたら希望の動作をするようになりました。
    2014年1月18日 0:27
  • つづき

    データテーブルを作成する場合は表示する形式に合わせた
    列を設けなければならないと勘違いしておりました。
    (例)
     今回の場合[分類ID]をキーに[職種分類]の文字を表示するので
     両方とも列として設けなければならない。

     またデータグリッドビューの列には、ビューをイメージした
     データソースを作り、それを当てはめなければならないと
     思い込んでおりました。

     ですので、データセット内でもテーブルを2つ合わせた
     TableAdapterを作りそれを基にデータグリッドビューの
     データソースの設定をしたのですがうまく動きませんでした。

     結局はデータグリッドビューに表示するデータソースは
     単一テーブル[M_ID_Pass]でよく、その見え方[DisplayMember]
     に参照先[M_分類]-[職種分類]を設定すればよいと言うことが
     わかりました。

     また、SQL Server のビューを基にデータテーブルを作成した
     場合でも、2つの単一テーブルを組み合わせてデータテーブルを
     作成した場合でも、UpdateCommand は自動作成してくれないことも
     わかりました。

     とても勉強になりました。
     また、おふたかたには議論を重ねていただき本当に感謝しております。
     その内容もどれも大変に勉強になるものばかりでした。
     ありがとうござます。

     どうか今後ともよろしくお願い申し上げます。

    2014年1月18日 0:29
  • > ご回答が遅くなり申し訳ございませんでした。
    > 自分なりの進展をご回答できるまで試行錯誤しておりました。

    できれば、あまり間を置かないで、つなぎでもいいですから、回答者のレスに対して何らかの応答をいただけると嬉しいのですが。

    先に自分からは、

    > ソースコードを見て確認する方法がわからないということならその旨書いてください。
     
    > さらに、どうしてもこの形でないとダメなのか(M_ID_Pass のみを扱うことに考え直す
    > 余地はないか)連絡ください。

    > どうしても 2 つのテーブルを同時に更新したいということであれば、JOIN したビュー
    > から作るのではなく・・・

    trapemiya さんからは、

    > 今あるデータセットで、「追加」 → 「TableAdapter」 → 「SQLステートメント
    > を使用する」で、以下のSQLを指定してTableAdapterを新たに作成してみて下さい。

    等の質問、提案をしていますが、それに対して無回答というのはいかがなものかと思います。

    「検討するからちょっと待ってほしい」という返答でもいいですから、何か返していただければと思います。

     

    2014年1月18日 9:57
  • SurferOnWww さま

    大変お世話になっております。

    > できれば、あまり間を置かないで、つなぎでも
    > いいですから、回答者のレスに対して何らかの
    > 応答をいただけると嬉しいのですが。
    > 「検討するからちょっと待ってほしい」という
    > 返答でもいいですから何か返していただければと
    > 思います。

    大変に申し訳ございません。以後気をつけるように
    いたします。今回のご回答も遅くなり申し訳ござい
    ません。


    > さらに、どうしてもこの形でないとダメなのか
    > (M_ID_Pass のみを扱うことに考え直す
    > 余地はないか)連絡ください。

    > どうしても 2 つのテーブルを同時に更新したいと
    > いうことであれば、JOIN したビューから作るのではなく・・・

    はい、このアドバイスを参考に、今回組み直してみた次第です。
    結果的にこの方法で動くようになりました。ありがとうございます。


    > ソースコードを見て確認する方法がわからないということなら
    > その旨書いてください。

    ただわかりませんでしたと言うのは失礼かと思い、あれこれ
    調べて試行錯誤しておりました。結果的に回答が遅くなり
    かえってご迷惑をお掛けしたと反省しております。

    > 今あるデータセットで、
    > 「追加」 → 「TableAdapter」 → 「SQLステートメント
    > を使用する」で、以下のSQLを指定してTableAdapterを新たに
    > 作成してみて下さい。

    これも試して見たのですがうまくいきませんでした。
    奥が深いと言うか、なかなかうまくいかないものです。
    色々作りまくって経験を積むしかないのでしょうか。

    2014年1月21日 8:42