none
データセットの更新をデータベースへ保存できない RRS feed

  • 質問

  • .NET VB2008 Visual Studio2008

    データテーブルの修正を行う為修正フォームを作成しました。

    修正対象のデータは、条件によってデータセットから修正するべきデータテーブルの値を引っ張り、修正フォームの各フィールドにバインディングさせています。

    修正が完了したあとupdateさせているのですが、データテーブルに修正が反映されません。

      Private Sub btnPlant_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPlant.Click
    
        Dim codeP As String '樹木ID
        codeP = Label8.Text '樹木IDをcodePへ
    
        Dim frm As New EditForm  '編集フォーム
        frm.Label2.Text = "樹木情報編集"
        frm.Label1.Text = "樹木ID"
        frm.Label3.Text = "樹木名"
        frm.Label5.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "Plant_ID", True))
        frm.TextBox6.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "Plant_Name", True))
        frm.TextBox5.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "Scientific_Name", True))
        frm.DateTimePicker.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "Update", True))
        frm.TextBox4.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "Memo", True))
        frm.ImagePath.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, "ImagePath", True))
    
    
    
        '指定した樹木IDのデータを表示する
        frm.setPlant_ID2(codeP, Me)
    
        '編集フォームを表示する
        frm.ShowDialog(Me)
    
      End Sub
    

    カード型フォームに用意されている「修正」ボタンで編集フォームを値がバインドされた状態で開き、修正が完了したら修正フォームの登録ボタンで登録する。

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
        'データの検査と編集中のデータの登録(エラーの時は処理を終了する)
    
        Try
          If Strings.Left(Label5.Text, 1) = "3" Then  '更新テーブルの振り分け" Then
          テーブルアダプタを介して、tbl_Verminを更新する
          Tbl_VerminTableAdapter.Update(Me.Vermination_SarchDataSet.tbl_Vermin)
    
          ElseIf Strings.Left(Label5.Text, 1) = 5 Then  '更新テーブルの振り分け
          テーブルアダプタを介して、tbl_Plantsを更新する
          Tbl_PlantsTableAdapter.Update(Me.Vermination_SarchDataSet.tbl_Plants)
    
        Catch ex As Exception
          MessageBox.Show(ex.Message)
    
        End Try
    
        frm.Label5.DataBindings.Clear
        frm.TextBox6.DataBindings.Clear
        frm.TextBox5.DataBindings.Clear
        frm.DateTimePicker.DataBindings.Clear
        frm.TextBox4.DataBindings.Clear
        frm.ImagePath.DataBindings.Clear
    
    		Me.Close()
    
      End Sub
    

    考え方が悪いのか、コードがおかしいのか…

    お知恵をお借りさせて下さい、ご教授お願い致します。

    2010年9月15日 5:17

回答

  • 入力された値によってDataTableは更新されていますが、まだ未確定状態のような気がします。Updateメソッドの前に、
    Tbl_PlantsBindingSource.EndEdit()
    を実行してみて下さい。 

    デーバッグでUpdateメソッドの戻り値を取得してみた所、「式は値を生成しません」と帰ってきてしまいました…

     ちょっとこれはわからないです。0または更新されたレコード数(今回の場合は1)になるはずですが・・・

    オプティミスティック同時時刻制御、データテーブルの更新全てチェックが入っており、主キーも設定してあります。

    TableAdapterの「更新を直接データベースに送信する為のメソッドを作成する」にもチェックを入れており、

     今回の件とは特に無関係です。Updateメソッドで更新されようとしていますので、「更新を直接データベースに送信する為のメソッドを作成する」も全く関係ありません。

    メソッド名がGetDataになっておりますがこれはどこかで指定するべき物ですか?

     これも今回の件とは無関係です。GetDataメソッドは文字通り、データベースからデータを取得するためのメソッドです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク chromeMAO 2010年9月16日 0:17
    2010年9月15日 15:32
    モデレータ

すべての返信

  • デバッグでTableAdapterのUpdateメソッドの戻り値を確認してみて下さい。戻り値はデータベースで処理されたレコード数になります。その値が0でないのであれば、以下が原因かもしれません。

    データーベースに変更内容を保存する。
    http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/fd7da4f7-c2a7-473d-8ee9-49fd70d9e5f4/


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月15日 6:22
    モデレータ
  • trapemiya様

     

    ご返信ありがとうございます。(データベースはSQL-Serverです。)

    デーバッグでUpdateメソッドの戻り値を取得してみた所、「式は値を生成しません」と帰ってきてしまいました…

    .xsdの各TableAdapterの詳細設定もINSERT、UPDATE、及びDELETEステートメントの生成、

    オプティミスティック同時時刻制御、データテーブルの更新全てチェックが入っており、主キーも設定してあります。

    TableAdapterの「更新を直接データベースに送信する為のメソッドを作成する」にもチェックを入れており、

    メソッド名がGetDataになっておりますがこれはどこかで指定するべき物ですか?

    またプロパティのUpdataCommandの横が(UpdateCommand)になっていますが正しいでしょうか?

     

     

     

    2010年9月15日 7:53
  • 入力された値によってDataTableは更新されていますが、まだ未確定状態のような気がします。Updateメソッドの前に、
    Tbl_PlantsBindingSource.EndEdit()
    を実行してみて下さい。 

    デーバッグでUpdateメソッドの戻り値を取得してみた所、「式は値を生成しません」と帰ってきてしまいました…

     ちょっとこれはわからないです。0または更新されたレコード数(今回の場合は1)になるはずですが・・・

    オプティミスティック同時時刻制御、データテーブルの更新全てチェックが入っており、主キーも設定してあります。

    TableAdapterの「更新を直接データベースに送信する為のメソッドを作成する」にもチェックを入れており、

     今回の件とは特に無関係です。Updateメソッドで更新されようとしていますので、「更新を直接データベースに送信する為のメソッドを作成する」も全く関係ありません。

    メソッド名がGetDataになっておりますがこれはどこかで指定するべき物ですか?

     これも今回の件とは無関係です。GetDataメソッドは文字通り、データベースからデータを取得するためのメソッドです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク chromeMAO 2010年9月16日 0:17
    2010年9月15日 15:32
    モデレータ
  • trapemiya様

     

    ご返答ありがとうございます。テンパっている質問にもご回答頂いてありがとうございました。

    アドバイス頂いた通り、Updateの前にTbl_PlantsBindingSource.EndEdit()を挿入してみましたが、やはり保存されませんでした。

    どんどん分からなくなってきてしまったので、他でも再現するかどうか最初からデータバインディングされている(フォームフィールド上に

    データテーブルをドラッグして自動的に出来るフィールド)フォームを作成してUpdateしてみた所、普通に正常終了しました。

    という事はDataBindings.Addのあたりがおかしいのではと思い、引き渡すフォーム側で指定していたDataBindings.Addを

    Dim frm As New EditForm
    
    frm.Label5.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.Tbl_PlantsBindingSource, _<br/>
     "Plant_ID", True)) <br/>
    
    

    表示された側のフォーム(引き渡されたフォーム)でDataBindings.Addしてみました。

      Public Sub setPlant_ID2(ByVal Pcode As String, ByVal f As frmDetail)
    
        '受け取った樹木IDを使用して、該当する樹木データをデータソースにセットする
        Me.Tbl_PlantsTableAdapter.FillByPcode(Me.Vermination_SarchDataSet.tbl_Plants, Pcode)
    
        Me.Label5.DataBindings.Add(New System.Windows.Forms.Binding("Text", _Me.Tbl_PlantsBindingSource, _
        "Plant_ID", True))
    
      End Sub

     

    その結果、ようやくUpdateしてくれるようになりました。

    お手本にしていたテキストでは引き渡す事になっていたので真似してみたのですが、やっていることは丸々真似でない為こういった事も

    起こるんだな、と勉強になりました…

    とにかくものすごく不安だったので、trapemiya様が返信して下さったおかげで落ち着く事ができました。

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

     

    2010年9月16日 0:16