System.OutOfMemoryException выдается - PullRequest
1 голос
/ 22 июня 2010

Я получаю исключение 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()

Скажите, пожалуйста, как мне диагностировать и исправить это исключение?Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 22 июня 2010

Было бы намного лучше изменить логику на один 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;
}
}
4 голосов
/ 22 июня 2010

В методе используется много конкатенаций строк, каждая из которых создает множество новых временных строковых объектов, которые занимают ваше пространство кучи.Этого можно избежать, используя 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()

Примечание. Как отметил Дэвид Нил в комментариях, в этом контексте он будетлучше использовать TagBuilder (или XmlWriter) для создания дерева документов HTML / XML.

...