トップ回答者
DataGridView上で、データ(文字、数字)を入力し保存して、 Accessにデータを反映させたい

質問
-
いつもお世話になります。
表題の件で、
苦慮しており皆様より教えて頂きたく質問を致します。
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 = cnDim dt As New System.Data.DataTable
da.Fill(dt)
DataGridView10.DataSource = dt()
End Subお忙しい所お手数をお掛けしますが、
ご教授下さいますようお願い致します。
回答
-
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
すべての返信
-
> 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
-
もしかして、自らのプログラミングによりDataGridViewにAccessデータを表示しようとしているのでしょうか?
でしたら、いささか面倒かも・・・。(先日まで私も同一内容で悩んでおりました。)
SurferOnWwwさんが提案しておりますチュートリアルにも有るとおり、「データソースウイザード」を使用すると簡単にアップデートも可能になります。
最終的にAccessファイルへの更新作業はTableAdapterが行ってくれるようになります。
以下にデータソースウィザードでも作成される更新時のコードの一例です。
'データベースの更新
Me.Validate()
Me.○○○BindingSource.EndEdit() ’○○○はBindingSauce名
Me.TableAdapterManager.UpdateAll(Me.○○○DataSet) ’○○○はDataSet名以上の3行は、データソースウィザードを使用すると、「バインディングナビゲータ」(メニューの直下に現れるDataGridView操作用)の「上書き保存」内に自動で記述されているはずです。
これを活用しますと、バインディングナビゲータなしでも、内部処理的に更新をさせたりすることもできます。
まずは、データソースウィザードを使用してみましょう。
先日まで、同一内容で悩んでいた者から。
- 回答の候補に設定 山本春海 2010年6月2日 6:27
-
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上にクエリの画面が表示され、入力は出来ます。しかしアクセスにデータが反映されません。
保存するコードを作成しないといけないのでしょうか?数字や文字を入力した後に行なう事は何かありますでしょうか?
ご回答頂けると幸いです。
-
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
-
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が表示されており、データを入れて保存し、アクセスへ反映させたいと思っております。
間違っている所などありましたら、ご教授頂けると助かります。
-
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お忙しい所申し訳ございませんが、ご教授いただけると助かります。
-
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