2013-02-20 41 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