none
データセットとデータバインディングされたデータグリッドビューの更新について RRS feed

  • 質問

  • 使用環境

    WINDOWSXP

    visualbasic EE

     

    いつもお世話になっています。

    oledbdataadapterを使用したデータベース更新を考えており、下記コードにて、データバインディングするところまで完成しました。

     

                        Dim Cn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\sekisan.mdb")
                        Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM meisai_master", Cn)
                        Dim ds As DataSet = New DataSet("meisai_master")
                        da.Fill(ds, "meisai_master")
                        Me.BindingSource1.DataSource = ds
                        Me.BindingSource1.DataMember = "meisai_master"
                        DataGridView2.DataSource = BindingSource1

     

    このコードにて、既存データベースのテーブル(meisai_master)をデータグリッドビューに表示することはできるのですが、データグリッドビューのデータを編集した際の更新方法に疑問点があります。プログラム上ではなくデザイナ等で構築した更新方法は、データベースエクスプローラにて接続先を確立させ、それに伴いデータセットを作成しますよね。そして、データセットされたデータグリッドビューをフォームに配置すれば、主キーさえ設定したテーブルであれば、コマンドビルダーにてコマンドを自動生成できます。そして、更新もボタン一つでOKです。

    結局、プログラム上でも同様のことをしたいわけですが、更新コードを下記コードのようにしました。

     

    Dim Cn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Sourcec:\sekisan.mdb")
                        Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM meisai_master", Cn)
                         Dim ds As DataSet = New DataSet("meisai_master")

                        Dim cb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(da)
                          da.Fill(ds, "meisai_master")

    *****************

    ここです!!!!!

    *****************

                    Try
                            Validate()
                            BindingSource1.EndEdit()
                            da.Update(ds, "meisai_master")
                        Catch ex As System.Exception
                            System.Windows.Forms.MessageBox.Show(ex.Message)
                        End Try

    これでは、更新するテーブルの器部分は出来ても、肝心な新しい編集データが保存できていないことになります。そこで、質問です。

    コード中の*****の部分に直接編集データ等をコーディングしないで、バインディングされたデータグリッドビューのデータで更新したい場合、どのようにすればよいのでしょうか?

    2007年5月23日 10:18

回答

すべての返信

  • DataGridView に Bind が成功しているのでしたら、単純に DataGridView で編集するだけではないでしょうか?

     

    保存できないということですか?

    2007年5月24日 0:08
  • ありがとうございます。

    更新(保存)できないうちに入るのでしょうね・・・。

    下記コードだとテーブル構造をデータアダプタでデータセットに入れてますよね。

    そして更新をかける際に、  da.Update(ds, "meisai_master")だと単に先ほどデータセットに入れた初期構造を更新するかたちになってしまい、結局データは不変となってしまいます。

    バインディングされたデータを更新する際に良い方法はないでしょうか?

                      da.Fill(ds, "meisai_master")

    *****************

    ここです!!!!!

    *****************

                    Try
                            Validate()
                            BindingSource1.EndEdit()
                            da.Update(ds, "meisai_master")
                        Catch ex As System.Exception
                            System.Windows.Forms.MessageBox.Show(ex.Message)
                        End Try

    2007年5月24日 1:38
  •  みやり さんからの引用
    da.Fill(ds, "meisai_master")

    これでは、DataGridView にバインドしている意味がなくなってしまいます。バインドすると DataGirdView で編集した結果が自動でバインドしている値に更新されます。なので、その自動で更新してくれた値を da.Update(ds, "meisai_master") の ds の部分に設定してやれば、うまく更新できるのではないでしょうか。自動で更新される値は BindingSource1.DataSource に入っていると思います。
    2007年5月24日 3:41
  •  みやり さんからの引用

    更新(保存)できないうちに入るのでしょうね・・・。

    レコードの新規保存も更新も、da.Update(ds, "meisai_master")だけでOKです。ただ、テーブルに主キーが設定されていないので、Update文が生成されていないため、更新はできないでしょう。テーブルに対して主キーを設定してあげて下さい。

    2007年5月24日 5:01
    モデレータ
  • da.fill(ds,"meisai_master")の部分を削除して、コードをやり直したらうまくいきました。(主キーが設定されているテーブルに関してはですけど・・・)。

    というのが、このデータベースはデザイナを使用して主キーを設定したテーブルとプログラム上で動的に作成するテーブルとが存在しており、前者に関しては先に述べたとおり更新がうまくいきます。

    私は、ADOXを使用してデータベース及びテーブルを作成していますが、使用するデータベースはMDBであり、ADOX以外の方法でデータベースを作成したいのですが、どのような方法があるのでしょうか?これについては、別スレッドで質問させていただくとして、主キーの設定方法は下記コードだとどのように記述すれば良いのでしょうか?宜しくお願いします。

        Sub データベース作成()
            '新規データベース作成
            Dim cat As Object
            cat = CreateObject("ADOX.Catalog")
            cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=" & AddressTextBox.Text & "\" & YearComboBox.Text & "\" & TextBox1.Text & ".mdb")

            '空明細テーブル作成
            Dim strTable As String
            Dim tbl As Object
            tbl = CreateObject("ADOX.TABLE")
            strTable = "meisai_master"
            tbl.Name = strTable
            cat.Tables.Append(tbl)
            With cat.Tables(strTable)
                .Columns.Append("Pnum")
                .Columns.Append("Code")
                .Columns.Append("Himoku")
                .Columns.Append("Kosyu")
                .Columns.Append("Suppli")
                .Columns.Append("Unit")
                .Columns.Append("Num")
                .Columns.Append("UnitPrice")
                .Columns.Append("TotalPrice")
                .Columns.Append("Used")
                .Columns.Append("Remarks")
            End With

    End Sub

    2007年5月24日 6:06
  •  みやり さんからの引用

    主キーの設定方法は下記コードだとどのように記述すれば良いのでしょうか?宜しくお願いします。

    一番最後に、以下の行を追加すれば良いと思います。

    tbl.Keys.Append("PrimaryKey", KeyTypeEnum.adKeyPrimary, "Pnum")

    2007年5月24日 6:40
    モデレータ
  • ありがとうございます!

    無事完了しました。助かりました!

    2007年5月24日 7:49