none
[VS2012 C#]SQLサーバーのViewに対してのSubmitChangesが反映されない RRS feed

  • 質問

  • SQLServerに複数のテーブルがあって、それぞれの主キーを使って

    Viewを作っています。

    そのViewからLinq to SQLクラスを作成してDBの操作(Update等)を行いたいのですが、

    hogeDataContext foo = new hogeDataContext();
    
    private void button2検索_Click(object sender,EventArgs e)
    {
       var result = from x in foo.View
                         where x.主キー == ID
                         select x;
    
      bindingSource1.DataSource = result;
      textBox1.DataBindings.Add("Text",bindingSource1,"フィールド");
      textBox2. ~~ //以下 各コントロールにバインド
    
    }
    //バインドしてあるテキストボックスを変更して更新ボタンをクリック
    
    private void button1更新_Click(object sender,EventArgs e)
    {
       foo.SubmitChanges();
    }

    を行なっても、Viewの値は更新されません。

    SQLServerManegementStudioからはViewでUpdate文を実行すると、ちゃんと元テーブルのデータも更新されます。

    なお、Linq to SQLクラスをテーブルにすると、この文でもちゃんと更新がされます。

    C#の仕様でViewに対しての更新は許可されていないのでしょうか?

    テーブル数が多くなると、Viewを組まないと非常にめんどくさいので、なんとかなる方法を探しています。

    よろしくお願いいたします。


    • 編集済み naoki_ 2013年7月4日 2:29
    2013年7月4日 2:28

回答

  • ググるとそれっぽい話が見つかります。

    Viewには主キーがないため更新できないようです。DMBLファイルを編集し主キーを設定してやることで更新できるようになるようです。
    # 試したわけではありません。

    • 回答としてマーク naoki_ 2013年7月4日 4:20
    2013年7月4日 2:42

すべての返信

  • ググるとそれっぽい話が見つかります。

    Viewには主キーがないため更新できないようです。DMBLファイルを編集し主キーを設定してやることで更新できるようになるようです。
    # 試したわけではありません。

    • 回答としてマーク naoki_ 2013年7月4日 4:20
    2013年7月4日 2:42
  • 回答ありがとうございます。

    そのページは拝見しまして、DMBLファイルに主キーを設定してみたのですが、

    実行時に例外は出ないのですが、フォームを閉じてもレコードは更新されていませんでした。

    2013年7月4日 4:02
  • 自己解決しました。

    原因は、Transaction処理の部分で、なぜかロールバックが発生していたようです。

    やはり、ViewのUpdateを行うときは、DMBLファイルに主キーを貼ればよいみたいです。

    ありがとうございました。

    2013年7月4日 4:19
  • Viewは必ずしも更新可能ではありませんが、その辺りは確認されていますでしょうか?
    もし、まだであれば、以下を確認してみて下さい。

    CREATE VIEW (Transact-SQL)における、「更新可能なビュー」
    http://msdn.microsoft.com/ja-jp/library/ms187956.aspx

    なお、上のページにも書かれていますが、INSTEAD OF トリガーを用いて、Viewを更新可能にすることもできます。

    また、私はあまりLinq to SQLは使用していないのですが、Viewの代わりにストアドプロシージャを使用できないでしょうか?


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

    2013年7月4日 4:20
    モデレータ
  • Viewは必ずしも更新可能ではありませんが、その辺りは確認されていますでしょうか?
    解決済みなので関係ないですが、質問文には「SQLServerManegementStudioからはViewでUpdate文を実行すると、ちゃんと元テーブルのデータも更新されます。」と書かれているので確認済みと読むべきではないでしょうか。
    2013年7月4日 4:25
  • あ~、単純に見落としました。すみません。
    ご指摘、ありがとうございます。


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

    2013年7月4日 7:30
    モデレータ