none
DataGridView上で、データ(文字、数字)を入力し保存して、 Accessにデータを反映させたい RRS feed

  • 質問

  • いつもお世話になります。

    表題の件で、

    苦慮しており皆様より教えて頂きたく質問を致します。

    Access2000とvb.net2008expresseditionを使用しております。
    OSはSP3です。

    Microsoft.Jet.OLEDB.4.0でAccessファイルに接続して、データを取得し、DataGridViewに表示する事は出来るのですが、
    DataGridView上で、データ(文字、数字)を入力し、Accessにデータを反映させる事は出来ますでしょうか?

    手順として
    1 Accessファイルと接続

    2 DataSetに存在するDataTableの変更された行を、Accessファイルに反映させる。
    削除された行、新規に登録された行、変更された行全てがAccessファイルのデータを更新などします。
    Tableadapterが行なう?

    以下のコードを作成し、

    datagridviewに表示する事は出来ております。

    Private Sub CheckBox9_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox9.CheckedChanged
            Dim cn As OleDb.OleDbConnection _
                  = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" _
                  & "Data Source=C:\xxxx\222222.mdb;")

            Dim cmd As New OleDb.OleDbCommand("新規登録")

         cmd.CommandType = CommandType.TableDirect
            Dim da As New OleDb.OleDbDataAdapter()
            da.SelectCommand = cmd
            da.SelectCommand.Connection = cn

            Dim dt As New System.Data.DataTable
            da.Fill(dt)
            DataGridView10.DataSource = dt()
          End Sub

     

    お忙しい所お手数をお掛けしますが、

    ご教授下さいますようお願い致します。

    2010年5月21日 7:37

回答

  • BindingNavigatorが表示されないということですが、既に作成中のファイルにて実施したのではないでしょうか?

    新規に作成した場合はBindingNavigatorが表示されるのですが。

    チュートリアルに有るとおり、データソースの追加でサンプルファイルをデータソースに追加した後、一番上に有る「Categories」データベースを丸ごとフォーム上に、ドラッグドロップをすると、BindingNavigatorが表示されるとともに、DataGridViewも作成され、以下のSaveItem_Clickが現れます。これが、Accessファイルへの更新を実施している本体になります。

     Private Sub CategoriesBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CategoriesBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.CategoriesBindingSource.EndEdit() 
            Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)

    End Sub

    こちらは、Foam_Loadになります。


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: このコード行はデータを 'NorthwindDataSet.Categories' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            Me.CategoriesTableAdapter.Fill(Me.NorthwindDataSet.Categories)

    End Sub

    たったこれだけで、Accessファイルに反映させることができるはずです。

    2個のDataSetを扱うなら、必然的にFoam_Load、並びにSaveItem_Click上のアンダーライン部分が必要数行数が増えていきます。

    同時に更新したくなければ、分ければ良いのですが、その際は、Me.Validate()は忘れないようにしましょう。

    あと、どの部分でエラーメッセージがでいているのか、ブレイクポイントを利用して見るのも良いかもしれません。

    • 回答としてマーク yosyoso 2010年6月3日 1:10
    2010年5月27日 12:20

すべての返信

  • > DataGridView上で、データ(文字、数字)を入力し、Accessにデータを反映さ
    > せる事は出来ますでしょうか?

    当然できますよ。Visual Studio (VB Express でも OK)のウィザードを使えば
    ほとんど(たぶん全く)コードを書くことなしにそのようなアプリを作成できま
    す。

    少々難しいかもしれませんが MSDN ライブラリのチュートリアルをやってみては
    いかがですか? 例えば、Access の場合下記のようなチュートリアルもあります。

    チュートリアル: Access データベース内のデータへの接続 (Windows フォーム)
    http://msdn.microsoft.com/ja-jp/library/ms171893.aspx

    • 回答の候補に設定 山本春海 2010年6月2日 6:27
    2010年5月21日 13:23
  • もしかして、自らのプログラミングによりDataGridViewにAccessデータを表示しようとしているのでしょうか?

    でしたら、いささか面倒かも・・・。(先日まで私も同一内容で悩んでおりました。)

    SurferOnWwwさんが提案しておりますチュートリアルにも有るとおり、「データソースウイザード」を使用すると簡単にアップデートも可能になります。

    最終的にAccessファイルへの更新作業はTableAdapterが行ってくれるようになります。

    以下にデータソースウィザードでも作成される更新時のコードの一例です。

    'データベースの更新
                Me.Validate()
                Me.○○○BindingSource.EndEdit()   ’○○○はBindingSauce名
                Me.TableAdapterManager.UpdateAll(Me.○○○DataSet)  ’○○○はDataSet名

    以上の3行は、データソースウィザードを使用すると、「バインディングナビゲータ」(メニューの直下に現れるDataGridView操作用)の「上書き保存」内に自動で記述されているはずです。

    これを活用しますと、バインディングナビゲータなしでも、内部処理的に更新をさせたりすることもできます。

    まずは、データソースウィザードを使用してみましょう。

    先日まで、同一内容で悩んでいた者から。

    • 回答の候補に設定 山本春海 2010年6月2日 6:27
    2010年5月24日 21:45
  • zue11364様、

    ご回答ありがとうございます。返信が遅れてしまいまして申し訳ありません。

    早速データソースウィザードにて以下のように作成をしました。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Me.Validate()
            ' Me.個人新規TableAdapter.Fill(Me.AAAADataSet.個人新規)
            Me.個人新規BindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.AAAADataSet)

            ' Me.Validate()
            'Me.団体新規TableAdapter.Fill(Me.AAAADataSet.団体新規)
            'Me.団体新規BindingSource.EndEdit()
            '
            Me.TableAdapterManager.UpdateAll(Me.AAAADataSet)

        End Sub
    DGV上にクエリの画面が表示され、入力は出来ます。

    しかしアクセスにデータが反映されません。

    保存するコードを作成しないといけないのでしょうか?数字や文字を入力した後に行なう事は何かありますでしょうか?

    ご回答頂けると幸いです。

     

    2010年5月26日 4:44
  • SurferOnWww様、

    ご回答ありがとうございます。

    返信が遅れてしまいまして申し訳ありません。

    色々やってみたのですが、うまく出来ませんでした。

    もう少し頑張ってやって行きます。

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

     

    2010年5月26日 4:46
  • Form1_Load メソッドに更新関係のコードを入れても意味がないですよ。そのあたり
    はきちんと理解してからやりましょう。

    ウィザードベースで作っているとすると、XxxxBindingNavigatorSaveItem_Click と
    いうイベントハンドラが自動生成されて、そのなかに更新関係のコードも自動生成
    されませんでしたか?

    DataTable + TableAdapter が二つあるようですが、それが理由で単にドラッグ&ド
    ロップするだけではダメなんですかね。

    一体どういうことをしようとしているのですか?

    2010年5月26日 14:11
  • Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Me.Validate()
            ' Me.個人新規TableAdapter.Fill(Me.AAAADataSet.個人新規)
            Me.個人新規BindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.AAAADataSet)

            ' Me.Validate()
            'Me.団体新規TableAdapter.Fill(Me.AAAADataSet.団体新規)
            'Me.団体新規BindingSource.EndEdit()
            '
            Me.TableAdapterManager.UpdateAll(Me.AAAADataSet)

        End Sub

    説明が不足していたようです。

    私が回答した3行は、DataGridViewで編集(更新)された内容をファイルに反映させるためのコードになります。

    よしたろうさんが行ったform_loadにこの3行を入れるということは、「読み込み」→「上書き」をその場でやっているに過ぎないことになります。

    あくまでも例で示しました3行は、DataGridViewにおいてDataを更新等した後に呼び出されるようにします。

    つまり、「上書き」や「登録」といったアクション内に記述。ということになります。

    SurerOnWwwさんがしているとおり、前回の内容においても示しているとおり、「ビンディングナビゲーター」という物が自動生成されるはずです。

    その上書きボタンをダブルクリックすると、XxxxBindingNavigatorSaveItem_Click内に、例で示している3行も自動で生成されるはずです。

    DataGridViewで更新後、このボタンを押せば反映されるはずです。

    ビンディングナビゲーターは削除もできますので、やりたい内容に応じて、更新用の3行を適宜の位置にコーディングしてみてください。

    参考になれば幸いです。

    • 回答の候補に設定 山本春海 2010年6月2日 6:29
    2010年5月26日 21:45
  • suferonwww様

    ご回答ありがとうございます。VB.netについては無知な状態(勉強中)であり、申し訳ありません。

    社員コードや生年月日などを新規で入力するフォーマットが2つ(A,B)あり、それを入れて保存し、アクセスに反映させたいと考えております。

    ウィザードで作成しましたが、Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadは出ましたが、XxxxBindingNavigatorSaveItem_Click は出ませんでした。

    フォーマットA、Bに対してbindingnavigator、bindingsource、tableadapterが1つずつあります。datasetについては1つです。

    DGVにフォーマットA,Bが表示されており、データを入れて保存し、アクセスへ反映させたいと思っております。

    間違っている所などありましたら、ご教授頂けると助かります。

     

     

    2010年5月27日 8:20
  • zue11364様

    ご回答ありがとうございます。VB.netについては無知な状態(勉強中)であり、申し訳ありません。

    社員コードや生年月日などを新規で入力するフォーマットが2つ(A,B)あり、それを入れて保存し、アクセスに反映させたいと考えております。

    ウィザードで作成しましたが、Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadは出ましたが、XxxxBindingNavigatorSaveItem_Click は出ませんでした。

    フォーマットA、Bに対してbindingnavigator、bindingsource、tableadapterが1つずつあります。datasetについては1つです。

    DGVにフォーマットA,Bが表示されており、データを入れて保存し、アクセスへ反映させたいと思っております。

    調べて考えたコードは以下の通りです。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Validate()
            Me.A TableAdapter.Fill(Me.●●DataSet. A)
            Me.B TableAdapter.Fill(Me.●●DataSet. B)
             End Sub

    上記のコードですとエラーはないのですが、以下のコードを書くと、エラーが出ます。

    HANDLES 句には、それを含む型または基本型の 1 つで定義された WithEvents 変数が必要です。

        Private Sub A BindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles A BindingNavigatorSaveItem.Click
            Me.Validate()

           Me.A BindingSource.EndEdit()
        End Sub
        Private Sub BindingNavigator1saveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigator1saveItem.Click
            Me.Validate()
            Me.B BindingSource.EndEdit()
        End Sub

    お忙しい所申し訳ございませんが、ご教授いただけると助かります。

     

     

     

    2010年5月27日 8:26
  • BindingNavigatorが表示されないということですが、既に作成中のファイルにて実施したのではないでしょうか?

    新規に作成した場合はBindingNavigatorが表示されるのですが。

    チュートリアルに有るとおり、データソースの追加でサンプルファイルをデータソースに追加した後、一番上に有る「Categories」データベースを丸ごとフォーム上に、ドラッグドロップをすると、BindingNavigatorが表示されるとともに、DataGridViewも作成され、以下のSaveItem_Clickが現れます。これが、Accessファイルへの更新を実施している本体になります。

     Private Sub CategoriesBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CategoriesBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.CategoriesBindingSource.EndEdit() 
            Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)

    End Sub

    こちらは、Foam_Loadになります。


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: このコード行はデータを 'NorthwindDataSet.Categories' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            Me.CategoriesTableAdapter.Fill(Me.NorthwindDataSet.Categories)

    End Sub

    たったこれだけで、Accessファイルに反映させることができるはずです。

    2個のDataSetを扱うなら、必然的にFoam_Load、並びにSaveItem_Click上のアンダーライン部分が必要数行数が増えていきます。

    同時に更新したくなければ、分ければ良いのですが、その際は、Me.Validate()は忘れないようにしましょう。

    あと、どの部分でエラーメッセージがでいているのか、ブレイクポイントを利用して見るのも良いかもしれません。

    • 回答としてマーク yosyoso 2010年6月3日 1:10
    2010年5月27日 12:20
  • > VB.netについては無知な状態(勉強中)であり、申し訳ありません。

    そうであれば、最初から 2 つのテーブルを同時に扱うような無理をす
    るのはやめて、まずは 1 つのテーブルでやってみて、少し理解を深め
    てからにしてはいかがですか?

    #クラス名などの大文字小文字の区 別をきちんとするようにしたり、
     一般的でない略号(例えば DGV)を使うのは避けるようにしません
      か?

    2010年5月27日 14:08
  • zue11364様、

    返信が遅くなり申し訳ありません。新規にプロジェクトを作成した所出来ました。回答を頂きながらなかなか返信が出来ず遅くなり申し訳ありませんでした。

    まだまだなので、今回ご教授頂いた事も含めて、勉強して行きます。

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

     

    2010年6月3日 1:08
  • SuferOnWWW様、

    返信が遅くなり申し訳ありません。新規にプロジェクトを作成した所出来ました。回答を頂きながらなかなか返信が出来ず遅くなり申し訳ありませんでした。

    まだまだなので、理解できる事もそうでない事も沢山ありますので、今回ご教授頂いた事も含めて、勉強して行きます。

    本当にありがとうございました。今後質問をさせて頂く際には、略語を使用しないようにします。

     

    2010年6月3日 1:10