我的代码中出现了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()
请告诉我如何诊断和修复此例外情况?非常感谢。
答案 0 :(得分: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文档树。
答案 1 :(得分: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;
}
}