2013-02-20 44 views
1

我有一个程序,读取在SQL Server中ntext列,并显示在一个富文本框的输出。对于其中一个值是抛出一个OutofMemoryException格式文本框 - 文本分配导致OutOfMemoryException异常

我使用SqlDataAdapter读取该列,然后将该列的内容附加到stringBuilder。我用下面这行代码得到异常。

rtbEventDesc.Text = stringBuilder.ToString(); 

显示的消息是:

内存不足,无法继续程序的执行。

我怎么去解决这个问题呢?这个特定行的列大小是9 MB,这并不是那么多。

+0

9MB颇多......这实际上是超出了正常的基于堆栈的对象的范围。在将其分配给文本框之前,您是否检查过对象是否仍然有效? – 2013-02-20 15:50:19

+0

这可能可能是你的情况http://stackoverflow.com/questions/4642786/c-sharp-richtextbox-outofmemory – Igoy 2013-02-20 15:58:18

+0

@Yogendra那不是我的情况。我需要显示列的全部内容。然后用户可以选择做她想做的事。 – abhi 2013-02-20 16:01:06

回答

0

我的建议是倾销coumn到一个临时文件,然后使用下面的读取文件:

rtbEventDesc.LoadFile(tmpFileName); 

希望它能帮助。


编辑

在这种情况下,你不能用一个文件来保存文件,也许你可以使用一个内存流:

Byte[] text = GetByteArrayFromSqlAdapter(); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    ms.Write(text, 0, text.Length); 
    rtbEventDesc.LoadFile(ms, RichTextBoxStreamType.RichText); 
} 

编辑II

看来THA t RichTextboxControl加载9Mb文件不够好,它不能更好地执行,并且主应用程序被卡住,并在Window标题中显示(Not Responding)消息。

有两个选项:

  1. 如果加载时间在合理的时间结束时,用一个BackgroundWorker或任何其他异步机制加载文件,提供反馈,同时加载用户。

    执行更好
  2. 使用其他文本框。我建议你使用Scintilla.NETAvalonEdit

+0

嗨丹尼尔,这就是我想要做的,但是这个代码运行在服务器上的程序集内,我可能有或没有写入文件的必要权限。有什么可以用内存流来完成吗?我目前正在探索这个选项。 – abhi 2013-02-20 16:12:47

+0

您可以使用MemoryStream,但我没有对其进行测试。希望能帮助到你。 – 2013-02-20 16:25:47

+0

我正在尝试使用您发布的代码。特定的表单现在在标题栏中显示(不响应)。 – abhi 2013-02-20 18:43:17