3

そのため、最近、C#/ASP.NET で大きなパラメーターの選択中にエラーをスローするコードに取り組んでいます。

タイプ 'System.OutOfMemoryException' の例外がスローされました。System.Text.StringBuilder.ToString() で

一般的な概要: コードは、ユーザーの選択に基づいてデータベースから一連のデータをクエリし、Excel ドキュメントに挿入して、ユーザーがエクスポート/ダウンロードできるようにします。最初に StringBuilder を使用して、XML の Prefix を次のように追加します。

const string startExcelXML = "<xml version>\r\n<Workbook " +
"xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
"xmlns:x=\"urn:schemas-    microsoft-com:office:" +
"excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
"office:spreadsheet\">\r\n <Styles>\r\n " +
"<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
"<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
"\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
"\r\n <Protection/>\r\n </Style>\r\n " +
"<Style ss:ID=\"BoldColumn\">\r\n <Font " +
"x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
"<Style     ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
" ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"Decimal\">\r\n <NumberFormat " +
"ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
"ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
"ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
"</Styles>\r\n ";

次に、ループを通過し、</Data></Cell>必要に応じて追加などを行ってから、最終的に次のように追加します。

const string endExcelXML = "</Workbook>";

これreturn contentSB.ToString();、例外が参照するメソッド内の唯一の ToString() であるため、このコードである必要があります。

同様の StackOverflow の問題: StringBuilder での興味深い OutOfMemoryException

考え: 次のコードを使用して、文字列の大きさの一般的なアイデアを取得しようとしました。これは、選択範囲が小さい場合は機能しますが、選択範囲が大きい場合は何も出力せず、contentSB は StringBuilder オブジェクトです。

    System.Diagnostics.Debug.WriteLine("String:", contentSB);
    System.Diagnostics.Debug.WriteLine("String length:", contentSB.Length);

参照されている他の StackOverflow の問題は追加時に発生しますが、私のものは ToString() を返すときに発生するため、ループ内の追加の途中ではなく、変換プロセス/リターンで発生するため、問題の原因は異なる可能性があります。根本的な原因は何ですか?どうすれば修正できますか?

4

1 に答える 1