C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DbGrid のすばらしさをご存知の方に


(過去ログ 137 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■80444 / inTopicNo.1)  DbGrid のすばらしさをご存知の方に
  
□投稿者/ ym (1回)-(2016/07/18(Mon) 21:09:39)

分類:[ASP.NET (VB)] 

お仕事で大量のデータをお使いになられDbGrid のすばらしさをご存知の方に
おたずね致します。

私はDbGridはVB6から使っているのですが、列が10であろうと20であろうと1千
万のデータを時の間に表示してくれます。VB.netになり、datagridVewなるもの
がでて、データの範囲を指定し,かろうじてVB2008で使っていました。

私の体感では、DbGridがMAXのデータであっても読み込みに3秒もかかる事あり
えないです。かたやDataGridViewは気が遠くなる程時間がかかってしまいます。

最近、VB2008でもDataGridは使える事がわかり、Win10でもVB6でDbGridが使え
る事がわかりましたが、DbGrid のすばらしさをご存知の方に、Vb.Netでどのよ
うにご対応されているのかお教えいただければ幸いです。よろしくお願い致し
ます。
引用返信 編集キー/
■80446 / inTopicNo.2)  Re[1]: DbGrid のすばらしさをご存知の方に
□投稿者/ WebSurfer (975回)-(2016/07/18(Mon) 23:08:03)
No80444 (ym さん) に返信

DbGrid とかは全く知らないのでレスする資格はないかもしれませんが
木になることがあったので一言。

> VB.netになり、datagridVewなるもの
> がでて、データの範囲を指定し,かろうじてVB2008で使っていました。

datagridview とは何ですか? System.Windows.Forms.DataGridView の
ことなら ASP.NET には使えませんけど。
引用返信 編集キー/
■80448 / inTopicNo.3)  Re[2]: DbGrid のすばらしさをご存知の方に
□投稿者/ ym (2回)-(2016/07/19(Tue) 05:10:16)
ありがとうございます。
項目を間違え、削除し再質問をと考えたのですが
やりかたがわからず、申し訳ありません。
VB2008です。
引用返信 編集キー/
■80451 / inTopicNo.4)  Re[3]: DbGrid のすばらしさをご存知の方に
□投稿者/ daive (124回)-(2016/07/19(Tue) 08:07:18)
True DbGrid
https://www.google.co.jp/search?hl=ja&q=DbGrid&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=True+DbGrid
これの事でしょうか?
GrapeCity(旧:文化オリエント)扱いの製品の事であれば、
GrapeCity サイトで製品資料が得られます。
VS20xx / VB20xx 製品対応に注意してください。
サーバーで使う場合のライセンスには注意してください。

VB2008対応製品が探せない場合は、代理店、メーカーに問い合わせしてみるやら。
エディションが不明です。Express / Standard / Pro ...


Windows Form :DataGridvView
ASP.NET   :GridView
https://www.google.co.jp/search?hl=ja&q=ASP.NET+Grdiview&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=ASP.NET+GrdView

VB6 ⇒ .NetFramework になって、DataGrdiView は遅いとは思います。(横に長い表、100〜200を超えた位から)
ASP.NET用のGridView はWEB技術での実現になり、Windows From のコントロールとは実装の仕方が異なるので、遅いと文句をいってもしょうがない。

標準コントロールで不満が有る場合は、サードパーティー製のコントロールを使うのはよくある事ですが、
ライセンス費がかかる、維持費がかかる、サーバーライセンスがかかる、場合があります。

>列が10であろうと20であろうと、1千万のデータを時の間に表示してくれます
100項目:列×10万行
10項目:列×100万行
何をしたいかが不明ですが、データ修正を行う場合であっても、グラフを描く場合でも、行数が多いですよねぇ。
1日=24時間=1440分=86400秒
1日分の1秒データを表示する場合でも、10万行はいらないし。

Windows10 での VB6のサポートは、
windows 10 vb6 サポート
https://www.google.co.jp/search?hl=ja&q=DbGrid&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=windows+10+vb6+%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
あたりから調べてください。1次情報は、マイクロソフトです。他所のサイトに書いてある事を鵜呑みにしないで、確認する必要がある事も。

引用返信 編集キー/
■80453 / inTopicNo.5)  Re[3]: DbGrid のすばらしさをご存知の方に
□投稿者/ WebSurfer (976回)-(2016/07/19(Tue) 09:37:31)
No80448 (ym さん) に返信

> 項目を間違え、削除し再質問をと考えたのですが

分類:[ASP.NET (VB)] を間違えたといってますか?

レスが付いているので今さら削除はなんですので、

(1) 修正点をここに書いてそのまま続ける、

or

(2) 別に新しいスレッドを立てたという説明と新しいスレッドの URL をここに
  書いていただき、新しいスレッドにはここの URL を書いてこのスレッドの
  続きであることを書く。

というのがよさそうです。

いずれの場合も、その際、何を作っているか(Windows Forms? WPF?, ASP.NET
Web Forms? その他?)、ご自分の環境(OS、DB サーバーとそのバージョン、Web
アプリならサーバー / ブラウザは何かなど)に関する情報を書いてください。

それから、何が課題なのか、何を解決したいのか、何を知りたいのか等をもう少
し明確にしていただければと思います。

DbGrid は今の環境でも使える、DataGridView では遅すぎて使えないというなら
今までどおり DbGrid を使えばすむ話じゃないの?・・・と思ってしまいます。

引用返信 編集キー/
■80458 / inTopicNo.6)  Re[1]: DbGrid のすばらしさをご存知の方に
□投稿者/ 魔界の仮面弁士 (773回)-(2016/07/19(Tue) 12:31:28)
2016/07/19(Tue) 14:34:35 編集(投稿者)

No80444 (ym さん) に返信
> 分類:[ASP.NET (VB)] 

Windows Forms アプリケーションの間違いですよね?

VB6 で Web アプリを作っていたとすると、選択肢としては

・ActiveX ドキュメント
・IIS アプリケーション(WebClass)
・DHTML アプリケーション
・ActiceX コントロール

ぐらいかと思いますが、このいずれかで DBGrid (DBGrid32.ocx : Data Bound Grid)を
使っていたというのは、ちょっと想像しにくいので…。


> 私はDbGridはVB6から使っているのですが、

確かに、DBGrid (DBGrid32.ocx) は VB6 に付属していましたが、
あくまでも VB4/VB5 からの移行を目的としたコントロールです。

標準ではインストールされておらず、CD-ROM から ocx ファイルを
ローカルにコピーしたうえで、手動でのライセンス割り当ておよび
レジストリ登録が必要な「互換部品」として提供されるものです。


そして、DBGrid を VB.NET から使うことはほぼ絶望的と言わざるを得ません。
VB6 向けの DataGrid (MSDatGrd.ocx) ならまだ救いはあったのですが。


AxDBGrid は、旧VB の デザイナーと深く結びついているがゆえ、
経験上、VB.NET 環境で期待動作させることが非常に難しいです。

デザイナーの対応が不十分というだけではなく、実行時にも
内部的に利用されているらしきワーカースレッドからの呼び出しエラーや、
それに伴う hWnd の生成失敗など、数々の障害を経験しています。


そもそも DBGrid は、たとえ VB6 であったとしても、OLE DB ベースの
データバインドに対応していません。御存知のように、デザイン時の段階で
「Data コントロール」または「RDO コントロール」に接続しておかねば
ならないという制限があります。

その上 VB.NET においては、Data コントロールも RDO コントロールも
実用にはなりません。
Microsoft.VisualBasic.Compatibility.VB6 名前空間の支援も無いですし。


特に「Data コントロール」は "標準コントロール" です。
そもそも ActiveX コントロールですら無いため、VB.NET 上から
呼び出すことができません。

「RDO コントロール」の方は、ライセンス上は Enterprise Edition が
必要です(再頒布しないなら VB6CONTROLS.REG の導入で利用可能)が、
こちらは "ActiveX コントロール" であることから、一応は
アップグレード ウィザードなどを通じて、AxMSRDC として
フォームに貼りつけて呼び出すことが出来ます。
ただし、デザイナーサポートは無いため、使うとすれば、実行時に
Resultset プロパティを通じて、レコードを自分で制御するような
使い方が必要となります。


結局のところ、バインドできない以上は、DBGrid(AxDBGrid) では
「Unbound何某」系イベントを通じてのアンバウンドモードしか
利用できないということになります。

アンバウンドモードであれば、特定のデータソースには依存しないため、
OLEDB でも RDO でも DAO でも ADO.NET でも、任意のデータソースと
連携が可能です。ただ、VB6 で使った事があれば御存知とは思いますが、
アンバウンドの場合、各イベントに対応したコードを書く手間が必要なので、
とてもお手軽な方法とは言えません。

第一、アンバウンドモードであれば、System.Windows.Forms.DataGridView でも
使えるわけですから、無理に ActiveX コントロールを使い続ける理由は
無いと思います。
https://msdn.microsoft.com/ja-jp/library/5s3ce6k8%28vs.110%29.aspx



> かたやDataGridViewは気が遠くなる程時間がかかってしまいます。

当方の VB2008 では、十分な速度が出ているように見えましたが、
具体的にはどの程度かかるのでしょうか?

下記のコードで実験してみましたが、バインド時間は
 一万件で 0.03 秒以内
 十万件で 0.30 秒以内
 百万件で 3.00 秒以内
という結果になりました。

# 各 5 回計測した最長時間を掲載しています。
# (キャッシュが効いた場合はもっと早いです)

※追記:上記では、件数オーダーを見誤って回答していました。
※ 再測定結果を No80461 に掲載しましたので、そちらもご覧ください。


データ形式やフォーマット指定、実行環境の性能などに
左右されるので一概には言えませんが、一応参考までに。


Public Class Form1
  Private WithEvents dgv As DataGridView
  Private WithEvents btn As Button
  Private WithEvents tbl As DataTable
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

    dgv = New DataGridView()
    dgv.Dock = DockStyle.Fill
    Controls.Add(dgv)

    btn = New Button()
    btn.Dock = DockStyle.Top
    btn.Text = "Bind"
    Controls.Add(btn)

    '一万件のサンプルデータ
    tbl = CreateSample(10000)
  End Sub

  Private Function CreateSample(ByVal rowCount As Integer) As DataTable
    Dim dt As New DataTable("TBL")
    dt.Columns.Add("COL1", GetType(Integer))
    dt.Columns.Add("COL2", GetType(Integer))
    dt.Columns.Add("COL3", GetType(Integer))
    For r As Integer = 1 To rowCount
      dt.Rows.Add(r * 100 + 1, r * 100 + 2, r * 100 + 3)
    Next
    dt.PrimaryKey = New DataColumn() {dt.Columns("COL1")}
    Return dt
  End Function

  Private Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn.Click
    dgv.DataSource = Nothing
    dgv.Columns.Clear()
    dgv.AutoGenerateColumns = True
    Dim sw As Stopwatch = Stopwatch.StartNew
    dgv.DataSource = tbl
    sw.Stop()
    MsgBox("完了:" & sw.Elapsed.ToString())
  End Sub
End Class
引用返信 編集キー/
■80459 / inTopicNo.7)  Re[4]: DbGrid のすばらしさをご存知の方に
□投稿者/ ym (3回)-(2016/07/19(Tue) 13:22:11)
皆様ありがとうございます。

私は測定プログラムを作っています。
製品を1日24時間稼動で1万個前後の検査をしますので、1日約1万個のデータが
存在します。
製品にはスペックがあり、オペレータは過去のデータを見たい場合があります。
その場合は検査現場で検査を止めて、数100万個前のデータも経過確認する事
もあります。従って、1つの画面で早急に確認できる環境が必要です。

VB6では推奨されていないのですが、以前のバージョン用にDbGridがあります。
検査プログラムは僅かな時間で立ち上がります。VB6はDatagridがありますが
プログラム立ち上げ時に読み込み時間がかかります。
製造現場のオペレータの仕事は沢山あり、パソコンの操作はその極一部で
早急な処理(オペレータがストレスを感じない)が必要です。


VB2008でもVB6同様の動作ができるようにしたいのですが、今のところ無理な状況
です。





解決済み
引用返信 編集キー/
■80460 / inTopicNo.8)  Re[2]: DbGrid のすばらしさをご存知の方に
□投稿者/ ym (4回)-(2016/07/19(Tue) 13:25:35)
魔界の仮面弁士様

感謝申し上げます。
早々にやってみます。
ありがとうございます。




引用返信 編集キー/
■80461 / inTopicNo.9)  Re[2]: DbGrid のすばらしさをご存知の方に
□投稿者/ 魔界の仮面弁士 (774回)-(2016/07/19(Tue) 14:28:57)
2016/07/19(Tue) 14:32:25 編集(投稿者)

No80458 (魔界の仮面弁士) に追記
> ■No80444 (ym さん) に返信
>> 列が10であろうと20であろうと1千万のデータを時の間に表示してくれます。

大変失礼しました。
列数・行数の情報を完全に読み落としていたようで。m(_ _)m


DataTable に溜め込む方法は、ADODB.Recordset でいうところの
「adUseClient & adOpenStatic」相当なので
流石にメモリ消費量がきつくなりました。

一千万×20列だと、各列 32bit 消費で、最低でも 763MB 相当。
数値ではなく文字列型だと数倍に増えますからね…。

手元の環境で再検証したところ、20列×1000万行をバインドさせると、
1分程度(およそ56〜58秒)といったところでした。


メモリ消費を抑えるためには、adUseServer & adOpenKeyset などのように、
全行をロードするのではなく、必要な行のみをロードする必要があるでしょう。

この場合、VirtualMode を使うことで、1分→10秒程度まで改善されます。

https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.virtualmode%28vs.110%29.aspx

それでも 10 秒というのは長い気もしますが、これは一度に
1000万件を扱った場合です。いきなり 1000万件を用意しようとすると、
AddCopies (あるいは RowCount)の段階で時間がかかってしまい、
その部分だけで 9.2〜9.9 秒程度を要してしまうことになります。


ですから実際に使う場合は、初期ロード数は数万件程度のオーダーに抑えておき、
必要に応じて、残りの部分を読み出すといった方法をとるようにするのが
良いと思います。それなら、現実的なパフォーマンスを得られそうです。
引用返信 編集キー/
■80462 / inTopicNo.10)  Re[3]: DbGrid のすばらしさをご存知の方に
□投稿者/ ym (5回)-(2016/07/19(Tue) 15:42:20)
魔界の仮面弁士 様

重ね重ねありがとうございます。

行き詰まった時、またお教えいただければ幸いです。

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

解決済み
引用返信 編集キー/
■80467 / inTopicNo.11)  Re[5]: DbGrid のすばらしさをご存知の方に
□投稿者/ 魔界の仮面弁士 (775回)-(2016/07/19(Tue) 20:13:43)
No80459 (ym さん) に返信
>> Vb.Netでどのようにご対応されているのかお教えいただければ幸いです。

そもそも、数千件以上のデータを一度にグリッドに表示させたとて
使い勝手が良いとは思えないので、多くても数万件を上限にしています。

PC のスペックにもよるのでしょうが、その程度の件数であれば、
十分な速度が確保できていますし。



> VB6では推奨されていないのですが、以前のバージョン用にDbGridがあります。
> 検査プログラムは僅かな時間で立ち上がります。VB6はDatagridがありますが
> プログラム立ち上げ時に読み込み時間がかかります。

12,891,912 レコードの Access mdb があったので試してみました。
ODBC データソースの場合は事情が異なると思いますが参考情報として:


DBGrid だと 0.1 秒未満でロードできましたが、
DataGrid だと 1.4 秒かかりました。なるほどワンテンポ遅れますね。

Microsoft.ACE.OLEDB.12.0 にすると、さらに遅くなって 2.3 秒かかる…。



'当方環境では、1.4 秒強
Set rs = New ADODB.Recordset
rs.ActiveConnection = ConnectionString     'Microsoft.Jet.OLEDB.4.0
rs.CursorLocation = adUseServer         'adUseClient だとメモリ負荷が高すぎるので adUseServer にする
rs.LockType = adLockReadOnly          '過去データの参照なので ReadOnly で十分
rs.CursorType = adOpenForwardOnly        'ロード高速化のため、前方カーソルにしておく
rs.Source = "LogTable"             'SQL ではなくテーブル名を指定
rs.Properties("IRowsetIdentity").Value = True  'adUseServer の場合、これが無いと表示できない
rs.Properties("Bookmarkable").Value = True   'adOpenForwardOnly の場合、これが無いと表示できない
rs.Open , Options:=adCmdTableDirect       'テーブルタイプカーソルを指定
Set DataGrid1.DataSource = rs          'DataGrid に割り当て


'当方環境では、1.5 秒弱
Set rs = New ADODB.Recordset
rs.ActiveConnection = ConnectionString     'Microsoft.Jet.OLEDB.4.0
rs.CursorLocation = adUseServer         'adUseClient だとメモリ負荷が高すぎるので adUseServer にする
rs.LockType = adLockOptimistic         '各レコードを編集可能にしておく、ただし主キー以外
rs.CursorType = adOpenKeyset          '主キーは全件ロードしておく
rs.Source = "LogTable"             'SQL ではなくテーブル名を指定
rs.Properties("IRowsetIdentity").Value = True  'adUseServer の場合、これが無いと表示できない
rs.Open , Options:=adCmdTableDirect       'テーブルタイプカーソルを指定
Set DataGrid1.DataSource = rs          'DataGrid に割り当て
解決済み
引用返信 編集キー/
■80485 / inTopicNo.12)  Re[4]: DbGrid のすばらしさをご存知の方に
□投稿者/ ym (6回)-(2016/07/21(Thu) 19:21:12)
魔界の仮面弁士 様

ご返事遅くなって申し訳ありません。
ありがとうございます。


魔界の仮面弁士 様もご存知だと思いますが、
今だNECのPC98が大活躍している製造現場
が結構あるそうです。私は10年以上前にN88及び
QBプログラムをVB6に書き換えました。

基本は今やっている事が、OSが変わっても言語
が変わっても,オペレーターの為に同じ動作,そして
品質が維持できる事です。
当面はXP,Win7で可能ですが、Win10でも次のOS
でも検査プログラムが動作しなければなりません。

実はDataGridは最近まで知りませんでした。幸い
VB2008ではDataGridは使えますので試してみます。

また,今回質問させていただき、ViewはVBにこだ
わらなくても、アクセス(AccessRuntime97含)でも
いいかとも考えつつあります。

色々お教えいただきありがとうございました。
お礼申し上げます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -