DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データベースの読み込み方法

環境/言語:[WinXp、VB.NET]
分類:[.NET]

Visual.Netを勉強したばかりの初心者です。
的外れな質問をするかもしれませんがご容赦下さい。

現在約60万件強(項目数46)のデータをACCESSテーブルで管理しています。
これをVB.NETに移管しよう考えています。
どんなものかデータを表示するフォームを作成し、下記の方法で実行したところ
非常に時間がかかってしまいました。

1.ACCESSデータベースに「Microsoft.Jet.OLEDB.4.0;Data」で接続
2.データアダプタを作成
3.データセットを作成
4.データグリッドに連結
5.読み込みボタンをおしてデータを読み込み(fill)、表示

(現象)
ACCESSではクエリーでSELECTを発行し画面に表示するまでに数秒しかかからなかっ
たが、VB.NETで同じ項目数(35項目)を選択コマンドに指定するとほとんど停止
状態になってしまう。
項目数を三分の一の12項目にへらしたら数秒で表示されるようになった。
元の35項目に戻した上で抽出条件を設定し、表示すると表示までの時間が早くなっ
た。


ここで質問です。
VB.NETでは大量のデータを取り扱う場合、読み込みの時間がかかるのは仕方がない
のでしょうか?
それとも何か読み込みの方法を変更等すれば早くなるのでしょうか?
もし、方法があればご教授下さい。
(全データの20項目程度を全件表示したい)

よろしくお願いいたします。

追伸
60万件強のACCESSデータは申請書の原簿なのでテーブルの構成を変更する事は出来ない
> それとも何か読み込みの方法を変更等すれば早くなるのでしょうか?
> もし、方法があればご教授下さい。

試したことはないですが、DataReaderを使ったほうが、データアダプタを使うよりも早いかもしれないです。けど、そんなに違わないかも、分からないですが、あいまいな回答ですいません。
■No12304に返信(もんさんの記事)
> 試したことはないですが、DataReaderを使ったほうが、データアダプタを使うよりも早いかもしれないです。けど、そんなに違わないかも、分からないですが、あいまいな回答ですいません。

DatasetにFillしてるから、Adapterなんでしょ。
もんさん有難うございます。

> DataReaderを使ったほうが、データアダプタを使うよりも

早速、ご指摘の方法で試してみた(みようとすた)のですが

「Dim dr As OleDbDataReader」とコードを記したところで
「OleDbDataReader」の部分がエラー表示になってしまいます。
(通常 as のあとに出てくる一覧に「OleDbDataReader」が出てこない。

参照設定か何かがオカシイのでしょうが現時点では判らないので悪戦中
そんな訳で結果報告を出せるまでは少し時間が必要です。
> ?
> DatasetにFillしてるから、Adapterなんでしょ。

あれ? 普通、DataReaderで読み出す場合はDataSet、Fill、Adapterは使わなくてもいけると思いますが。
2005/08/23(Tue) 08:58:07 編集(投稿者)

>「Dim dr As OleDbDataReader」とコードを記したところで
>「OleDbDataReader」の部分がエラー表示になってしまいます。
>(通常 as のあとに出てくる一覧に「OleDbDataReader」が出てこない。

>参照設定か何かがオカシイのでしょうが現時点では判らないので悪戦中
>そんな訳で結果報告を出せるまでは少し時間が必要です。

imports system.data
imports system.data.oledb

記述してますか?おそらくこの記述が必要だと思います。
それと、この場合、データグリッドに表示できるかな? 読み出すだけなら、リストに表示はできますが。
> それと、この場合、データグリッドに表示できるかな? 読み出すだけなら、リストに表示はできますが。

データグリッドに表示するのも、できそうですね。下記参考になればと思います。

'新しいテーブルを作る
Dim tbl As New DataTable
'必要な列を作る
tbl.Columns.Add("CustomerID")
tbl.Columns.Add("CompanyName")
Dim row As DataRow

While rdr.Read
row = tbl.NewRow
row("CustomerID") = rdr("CustomerID")
row("CompanyName") = rdr("CompanyName")
tbl.Rows.Add(row)
End While

rdr.Close()
cn.Close()

DataGrid1.DataSource = tbl
もんさんお世話になっております

ご指摘の通り
> imports system.data
> imports system.data.oledb

を記述したらうまく行きました。
(記述する場所がわからなくて、返事が送れてしまいました m(_ _)m )

結果は信じられないほど早くなりました。
有難うございました。
もんさんお忙しいところソースまで記述して頂き有難うございました。

皆様のおかげで非常に早くデータを読み込む事が可能になれいました。
もんさんのソースを利用させていただきデータグリッドに表示もできました。

追加質問をさせてください。

データグリッドに表示するにはもんさんご指摘のように新しいテーブルを
作成しないと不可能なのでしょうか?
(ゆくゆくはデータの削除・更新などといった機能も付加したいので)
> データグリッドに表示するにはもんさんご指摘のように新しいテーブルを
>作成しないと不可能なのでしょうか?

データグリッドのDataSourceのヘルプを見てもらえば分かると思いますが、データリーダを直接データグリッドに表示できないようです。だから、テーブルを使いました。だから、おそらくですが、作成しないと不可能だと思います。

>(ゆくゆくはデータの削除・更新などといった機能も付加したいので)

削除は下記を参照して、
http://dobon.net/vb/dotnet/datagrid/currentrow.html

Dim bm As BindingManagerBase = _
DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)
If bm.Count = 0 Then
Return
End If
Dim drv As DataRowView = CType(bm.Current, DataRowView)
Dim dr As DataRow = drv.Row
dr.Delete()

データグリッドで選択した1行を削除ができますが、更新は大変かな?と思います。自分でパラメータを作成しなければならないかもしれません。
もんさん有難うございます。

> データグリッドのDataSourceのヘルプ

なるほど、そこまで気が廻りませんでした。
お忙しいところ申し訳ないです。

おかげさまで質問を発するまでは、右も左もわからなかった
のですが、少しはプログラム作成に対する自信みたいなものが
沸いてきました。

有難うございました。
解決済み!
もう、見てないかな?追加ですが、今調べていたのですが、
DataReaderは読み取り専用のようです。だから、編集には向いていないかもしれません。(読み出すだけなら速いのですが。)最初に、「2データアダプタを作成」、「3データセットを作成」と書いてありましたが、これはウィザードから作成したものでしょうか? ひょっとしたら、ウィザードを使わないで、作成したら、わりと速いかもしれません。できたら、そちらも、一度試されてはいかがでしょうか?
もんさんお世話になっております。

>ウィザードを使わないで、作成したら、わりと速いかもしれません。

参考書を片手にやってみました。
何とか動くようになりました。\(^o^)/
使用したmDBが違うので早さのほうはまだ測ってはありません。

おかげさまで経験値がまた上がりました。
今後もよろしくお願いいたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板