1

コードで system.outofmemory 例外が発生しています。

While r1.Read()
                    menu1id = r1("id")
                    db.AddInParameter(command2, "@menu1id", DbType.Int32, menu1id)
                    r2 = db.ExecuteReader(command2)
                    command2.Parameters.Clear()
                    menu1heading = r1("Heading")
                    If r1("url") IsNot Nothing And r1("moduleid") = 0 Then
                        url = r1("url").ToString

                        If InStr(url, "file:///") > 0 Then
                            Dim builder As New StringBuilder
                            builder.Append("<a href=")
                            builder.Append(r1("url"))
                            builder.Append(" target=")
                            builder.Append(r1("urltarget"))
                            builder.Append(">")
                            builder.Append(menu1heading)
                            builder.Append("</a>")
                            level1.Add(builder.ToString)
                        Else
                            Dim builder As New StringBuilder
                            builder.Append("<a href=http://")
                            builder.Append(r1("url"))
                            builder.Append(" target=")
                            builder.Append(r1("urltarget"))
                            builder.Append(">")
                            builder.Append(menu1heading)
                            builder.Append("</a>")
                            level1.Add(builder.ToString)
                        End If
                    Else
                        Dim builder As New StringBuilder
                        builder.Append("<a href=~/Default.aspx?id=")
                        builder.Append(r1("id"))
                        builder.Append(">")
                        builder.Append(menu1heading)
                        builder.Append("</a>")
                        level1.Add(builder.ToString)
                    End If


                    While r2.Read
                        menu2id = r2("id")
                        db.AddInParameter(command3, "@menu2id", DbType.Int32, menu2id)
                        r3 = db.ExecuteReader(command3)
                        command3.Parameters.Clear()
                        menu2heading = r2("Heading")

                        If r2("url") IsNot Nothing And r2("moduleid") = 0 Then
                            Dim builder As New StringBuilder
                            builder.Append("<a href=http://")
                            builder.Append(r2("url"))
                            builder.Append(" target=")
                            builder.Append(r2("urltarget"))
                            builder.Append(menu2heading)
                            builder.Append("</a>")
                            level2.Add(builder.ToString)
                        Else
                            Dim builder As New StringBuilder
                            builder.Append("<a href=~/Default.aspx?id=")
                            builder.Append(r2("id"))
                            builder.Append(">")
                            builder.Append(menu2heading)
                            builder.Append("</a>")
                            level2.Add(builder.ToString)
                        End If


                        While r3.Read
                            menu3heading = r3("Heading")
                            menu3id = r3("id")
                            If r3("url") IsNot Nothing And r3("moduleid") = 0 Then
                                Dim builder As New StringBuilder
                                builder.Append("<a href=http://")
                                builder.Append(r3("url"))
                                builder.Append(" target=")
                                builder.Append(r3("urltarget"))
                                builder.Append(">")
                                builder.Append(menu3heading)
                                builder.Append("</a>")
                                level3.Add(builder.ToString)
                            Else
                                Dim builder As New StringBuilder
                                builder.Append("<a href=~/Default.aspx?id=")
                                builder.Append(r3("id"))
                                builder.Append(">")
                                builder.Append(menu3heading)
                                builder.Append("</a>")
                                level3.Add(builder.ToString)
                            End If

                        End While

                        r3.Close()
                    End While

                    r2.Close()
                End While

                r1.Close()
            End While
            r0.Close()

この例外を診断して修正する方法を教えてください。どうもありがとう。

4

2 に答える 2

4

このメソッドは多くの文字列連結を使用し、それぞれがヒープスペースを消費する多くの新しい一時文字列オブジェクトを作成します。StringBuilderこれは、を使用して連結文字列を作成することで回避できます。たくさんの文字列を連結するときのStringBuilder作業はメモリ効率が高いだけでなく、はるかに高速になります。

Dim builder As New StringBuilder()
builder.Append("<a href=")
builder.Append("r0("url"))
builder.Append("target=")
builder.Append(r0("urltarget"))
builder.Append(menu0heading)
builder.Append("</a>")

Dim str as String
str = builder.ToString()

注:コメントでDavid Nealeが指摘しているように、このコンテキストでは、TagBuilder(またはXmlWriter)を使用してHTML/XMLドキュメントツリーを作成することをお勧めします。

于 2010-06-22T09:00:08.080 に答える
4

ロジックを単一のSQLクエリに変更して、すべてのメニュー項目を一度に返し、このデータセットを繰り返してメニューを作成する方がはるかに良いでしょう。

あなたはただ試すことができます

SELECT id, DepartmentID, GroupingID, Heading, OrderID, 
Publish, moduleid, url, urltarget
FROM Grouping 
WHERE (DepartmentID = 0 AND Publish <> 0)
ORDER BY OrderID

これにより、ツリー構造を決定するGroupingIDを含め、上記のクエリが返すすべてのデータが返されます。結果をオブジェクトのコレクションにロードし、LINQを使用してそれらをクエリしてメニューを作成できるはずです。

データを次のクラスにコピーし、それらのリストでLINQを使用します。

public class DataClass
{
public string Id { get; set; }
public string DepartmentID { get; set; }
public string GroupingID { get; set; }
public string Heading { get; set; }
public string OrderID { get; set; }
public string Publish { get; set; }
public string Moduleid { get; set; }
public string Url { get; set; }
public string Urltarget { get; set; }

public List<DataClass> Children { get; set; }

public DataClass(string id, string departmentID, string groupingID, string heading, string orderID, string publish, string moduleid, string url, string urltarget)
{
    Id = id;
    DepartmentID = departmentID; 
    GroupingID = groupingID;
    Heading = heading;
    OrderID = orderID; 
    Publish = publish;
    Moduleid = moduleid;
    Url = url;
    Urltarget = urltarget;
}
}
于 2010-06-22T09:21:05.163 に答える