DataSetの更新方法

解決


HARU  2007-10-30 01:28:05  No: 137983

VB2005でエクセルのブックをデータセットに取り込んでDataGridViewで表示しています。
元のエクセルファイルを更新した場合に、フォーム上でボタンを押したら更新されたデータを表示するようにしたいのですが、Fillでデータを取得して、DataSource、DataMemberを更新しているのですが、フォームに表示されるのは更新以前のデータです。
ソリューションエクスプローラを見ると、.mdbファイルが出来ていて、その中のデータを更新するとフォーム上のデータも更新されています。
何か、基本が間違っていると思うのですが、どこをどうすればよいのか分かりません。
どなたかご教授お願いします。


魔界の仮面弁士  2007-10-30 01:35:34  No: 137984

話の前後関係がまったく掴めないのですが…。
(実際に行った手順も、記述したコードも書かれていないので)

> .mdbファイルが出来ていて
勝手に mdb が出来るはずも無いので「mdb を作るような操作」をしたのでしょう。

意図的に作っているのであれば、そのエクセルファイルと mdb ファイルの関係は何ですか?
意図せず出来てしまっているのなら、どのようなコードを書いているのですか?


HARU  2007-10-30 02:14:28  No: 137985

魔界の仮面弁士 さんご指摘ありがとうございます。

エクセルのファイルを読み込みたかったのですが、右も左も分からず、本を買ってきたり、ネット調べたりしながらやってます。
DataGridviewの使い方を見ていると、本や、ネットだと大体がデータベースを使ったサンプルだったので、最初はエクセルファイルをアクセスのデータベースに変換して使い方を勉強しました。
その後エクセルのファイルを直接取り込むようにDataGridViewの設定を変えてみました。(最初、エクセルだと巧く取り込めなかったもので)
VB2005のウィザードを使用して作っているので、データセットの製作時は自分でコードを書いてません。
自分が書いたのはボタンクリック時のイベントの

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

Me.TD6450_07_07_181TableAdapter.Fill(Me._LAV_注残分リストDataSet._TD6450_07_07_181)
Me.TD64500707181BindingSource1.DataMember = "TD6450 07#07#181"
Me.TD64500707181BindingSource1.DataSource = Me._LAV_注残分リストDataSet
    
End Sub

この部分だけです。

たぶん最初の設定がどっかに残ってしまっているのだろうと思って、データセットを削除して作り直したりしたのですが、どうしてもうまくいきません。
まったくの初心者なのでどうぞよろしくお願いします。


魔界の仮面弁士  2007-10-30 04:28:58  No: 137986

そもそも Excel データの(取得はともかく)更新機能は、かなり限定的です。
細かい制御が必要なら、ADO.NET ではなくオートメーションに切り替えるべきかと。

> その後エクセルのファイルを直接取り込むようにDataGridViewの設定を変えてみました。
DataGridView クラスには、Excel ファイルをとりこむ機能は無い筈です。
変更したのは、System.Data 系のクラス(DataSet, TableAdapter 等)ですよね?

> データセットを削除して作り直したりしたのですが、どうしてもうまくいきません。
作成手順を明示してもらえますか?


HARU  2007-10-30 07:46:59  No: 137987

魔界の仮面弁士様
ご迷惑をおかけします。
確かに変更したのはDataSetとTableAdapterのところです。
私が行いたいのは単純にデータを取り込むだけで、Excelファイルを書き換える必要はありません。
現在の状況は、フォームを開く時、またはボタンを押したときにExcelのファイルを読み込んで、データセットを更新するようにしてあるのですが、Excelのファイルを書き換えた後、フォームを開いてもボタンを押してもExcelファイルの変更がデータセットに反映されない状態です。

現在までの作成手順
1.エクセルのシートをアクセスのテーブルにインポートしてデータベースを作成しました。

2.VB2005でフォームにアイコンを使用してDataGridViewとボタンを作成しました

3.DataGridViewの右上に出るボタンをクリックして出てきたダイアログのからウィザードを使用して1.で作ったデータベースからODBCを使ってデータを取り込む用に設定。
この時点でデバックを開始し、データが表示されることを確認。

4.デバックを終了して、フォームのエディットビューに戻りDataGridViewを削除する。

5.ソリューションエクスプローラーでDataSetをすべて削除

6.サーバーエクスプローラーで接続をすべて削除

7.3.同様にウィザードを使用して、1.で作成したデータベースの元になったExcelのファイルからODBCを使用してデータを取り込みように設定。

8.ボタンにのクリックイベントに
Me.TD6450_07_07_181TableAdapter.Fill(Me._LAV_注残分リストDataSet._TD6450_07_07_181)
Me.TD64500707181BindingSource1.DataMember = "TD6450 07#07#181"
Me.TD64500707181BindingSource1.DataSource = Me._LAV_注残分リストDataSet
と記述

8.デバックを開始してデータが表示されることを確認

9.デバックを終了してからサーバーエクスプローラーで現在の接続を一度切断

10.エクセルを立ち上げデータを修正後セーブしてエクセルを閉じる

11.再びデバックを開始しても表示されるデータは更新されていない、ボタンを押してデータセットの更新を行っても同様。

以上のような状況です。
今書いていて気がついたのは、アクセスのデータベースファイルも、エクセルのブックも同じ名前を使用していることに問題があるのかも・・・
ODBCのマウントあたりも気になります。


魔界の仮面弁士  2007-10-30 11:11:29  No: 137988

デバックではなく、デバッグ(Debug)です。

> 1.エクセルのシートをアクセスのテーブルにインポートしてデータベースを作成しました。

そもそも、そこで Access が出てくる必要は無いかと。
ODBC 接続なのであれば、適当な DSN を用意して、SQL を

SELECT * FROM `Sheet1$`

とした TableAdapter を作るだけで読み込めるはずです。
# ただし稀に、ODBC ドライバのバージョンによっては、
#   ERROR [HYC00] [Microsoft][ODBC Excel Driver]オプションの機能は実装されていません。
# などのエラーになる事もあるようですが。

> Me.TD6450_07_07_181TableAdapter.Fill(Me._LAV_注残分リストDataSet._TD6450_07_07_181)
この TableAdapter のデザイナを開き、TableAdapter の Connection が
Excel 用の接続になっているかどうかを確認してみてください。


HARU  2007-10-31 03:40:42  No: 137989

まさに、
>#   ERROR [HYC00] [Microsoft][ODBC Excel Driver]オプションの機能は実装されていません。
まさにこれです、そのためにわざわざアクセスまで引っ張り出してODBCの問題を確認したのでした。
そのときにドライバーのバージョンの問題も調べましたがこちらは特に問題ありませんでした。
DataSet関係で自動生成されたコードをすべて削除しして、自分で書き直したところ、何とか動いてくれました。
急がば回れってとこですかね?
いろいろお騒がせいたしました、ありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加