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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.80458 の関連記事表示

<< 0 >>
■80458  Re[1]: DbGrid のすばらしさをご存知の方に
□投稿者/ 魔界の仮面弁士 -(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
記事No.80444 のレス /過去ログ137より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -