- - PR -
VB.NETでのDBデータ保持処理について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-11-22 12:09
了解です。
話を聞く限りでは、怪しいのはこのあたりかと思いますが、 実際のソース コードを提示して頂かないとピンポイントなアドバイスは難しかろうと思います。 # ところで、ボトルネックはどこなのかの調査が足らないように思えるのですが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-11-22 12:36
実際の取得ロジック次第だとは思いますが、
データの取得の際、SQLというかDBから値を拾うロジックが 何回実行されているのでしょう? #今までの文面からしますと1件のデータを取得するのに #3回(=リレーションの深さ)抽出が行われている感じに見えました リレーションが深くなるほどに遅くなるということは そのあたりが気になります。 DBからデータ抽出が全体を通して1度のみ実行、ということであればフィールドなどを操作するあたりに問題があるかもしれません。 | ||||||||
|
投稿日時: 2006-11-22 20:45
ボトルネックになりそうな部分のコードを記載します。
public class Modeler Public Function selectQuery(ByVal query As String, ByVal databasename As String) Dim recordColl As New Collection Dim columnColl As New Collection Dim columnSize As Integer Dim tableobj As New ArrayList Dim hashtable As New Hashtable Dim tablearray As New DataTable Dim selectQueryAdapter As New OleDb.OleDbCommand Dim oDataAdapter As New OleDb.OleDbDataAdapter Dim recordarray As New ArrayList Dim tablecount As New Integer tablearray.Clear() Dim con As New OleDb.OleDbConnection() Try con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "database.mdb" selectQueryAdapter.Connection = con con.Open() selectQueryAdapter.CommandText = query oDataAdapter.SelectCommand = selectQueryAdapter oDataAdapter.Fill(tablearray) Catch ex As Exception MsgBox("DB接続時に問題が発生しました") Finally If Not con Is Nothing Then con.Close() End If End Try tablecount = tablearray.Rows.Count hashtable.Clear() hashtable.Add("kubunchi", 1) hashtable.Add("member", 2) hashtable.Add("childmember", 3) Dim k As Integer For k = 0 To tablecount - 1 Select Case hashtable.Item(databasename) Case 1 tableobj.Add(New Kubunchi) Case 2 tableobj.Add(New Member) Case 3 tableobj.Add(New Childmember) End Select Next If tablecount = 0 Then MsgBox("データがありません") Return 0 End If columnSize = tablearray.Rows.Item(0).ItemArray.Length Dim i As Integer Dim j As Integer For i = 1 To tablecount recordColl.Add(tableobj.Item(i - 1), i) 'カラムデータ追加処理 For j = 0 To columnSize - 1 columnColl.Add(tablearray.Rows.Item(i - 1).Item(j), tablearray.Rows.Item(i - 1).Table.Columns.Item(j).ColumnName) Next recordColl.Item(i).setColumnDataInit(columnColl) For j = 1 To columnColl.Count columnColl.Remove(1) Next recordarray.Add(recordColl.Item(i)) Next Return recordarray End Function End class 以下はデータ取得処理です。 Dim model As New Modeler Dim memberArray as new ArrayList memberArray = model.selectQuery("select * from member", "member") member = CType(memberArray.Item(i - 1), Member) chiledmemberArray = model.selectQuery("select * from childmember where fkeymember = " & member.getPkeymember, "childmember") For j = 1 To childmemberArray.Count coll.Add(memberkbn(tmp), "memberkbn" & i & "_" & j) tmp += 1 childmember = CType(childmemberArray.Item(j - 1), Childmember) coll.Item("memberkbn" & i & "_" & j).Text = childmember.getToMember().getToKubunchi().getKubunchiname() Next データ取得処理でリレーションの分だけFor文が深くなります。 ここが原因だと思うのですが、このシステム上、childmemberに紐づくmemberの区分値を表示しないといけないので、このような処理になってしまいます。 [ メッセージ編集済み 編集者: uniqque 編集日時 2006-11-22 20:47 ] | ||||||||
|
投稿日時: 2006-11-24 01:04
ソースを提示していただいたのですが、この中でuniqqueさんが怪しいと
思っている箇所はどのあたりになるのでしょう? 他の方も言われていますが、少し細かく区切って調査してみるといいとは思います。 今はデータ的に少量なので目に付きにくいのでしょうが、件数を10倍ぐらいに増やしてみるといいのではないでしょうか。 的がはずれているかも知れませんが、個人的には
の箇所がちょっと気になります。雰囲気としてはメンバー情報で持っている区分値があり、 その名称を取得しているのでしょうけど、これは
と、切り替えることができそうな気がしますね。データとしては恐らく1:1な リレーションになってる気配があります・・・。 |