2017-07-01 10 views
1

私は100000以上のレコードをデモしようとすると、内部でメモリストリームクラスを保存するXml Documentオブジェクトではありません。XmlDocument.save()メソッドは、C言語を使用してMemoryStreamの100000以上のレコードを格納していません#

今回のエラーはメモリ不足例外が発生しています。

私は以下のデモを作成します。

はvrtual XMLファイルを作成し、私は内部のXmlDocumentを作成するには、最初のコードを説明し、私はあなたが直接SQLでXML変換を行うこととしたいバイト配列を選択してみてください可能性が

     con.Open(); 
         SqlCommand cmd = new SqlCommand("select top 1000000 * from 
         temp ", con); 

         XmlDocument doc = new XmlDocument(); 
         XmlElement root = doc.CreateElement("root"); 

         using (sdr = cmd.ExecuteReader()) 
         { 
          while (sdr.Read()) 
          { 
           XmlElement audit = doc.CreateElement("AuditHistory"); 
           XmlElement rowId = doc.CreateElement("rowid"); 
           rowId.InnerText = Convert.ToString(sdr["rowid"]); 
           audit.AppendChild(rowId); 
           XmlElement rowName = doc.CreateElement("rowname"); 
           rowName.InnerText = Convert.ToString(sdr["rowname"]); 
           audit.AppendChild(rowName); 
           XmlElement rowCount = doc.CreateElement("rcount"); 
           rowCount.InnerText = Convert.ToString(sdr["rcount"]); 
           audit.AppendChild(rowCount); 
           root.AppendChild(audit); 
          } 
         } 

         doc.AppendChild(root); 
         con.Close(); 
         MemoryStream str = new MemoryStream(); 
         doc.Save(str); 
      byte[] fileContent = str.ToArray(); 
         str.Flush(); 
         str.Close(); 


      doc.save(str) inside out of memory exception is generate. 

      how can i resolve this issue. 

答えて

1

内部のメモリストリームクラスでこのオブジェクトを格納します。

SqlCommand cmd = new SqlCommand("select cast((select top 1000000 rowid, rowname, rcount from temp AuditHistory for xml raw) as varchar(binary)", con); 
byte[] data= cmd.ExecuteScalar() as byte[]; 

それとも、XmlDocumentオブジェクトを作成するように、メモリストリームに直接書き込むようにしたXmlWriterを使用することができますが、メモリと遅いものダウンの多くを取るために起こっている:

 XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     MemoryStream ms = new MemoryStream(); 

     SqlCommand cmd = null; 
     using (XmlWriter writer = XmlWriter.Create(ms, settings)) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("root"); 

      using (SqlDataReader sdr = cmd.ExecuteReader()) 
      { 
       while (sdr.Read()) 
       { 
        writer.WriteStartElement("AuditHistory"); 
        writer.WriteStartElement("rowid"); 
        writer.WriteString(Convert.ToString(sdr["rowid"])); 
        writer.WriteEndElement(); //end rowid 
        writer.WriteStartElement("rowname"); 
        writer.WriteString(Convert.ToString(sdr["rowname"])); 
        writer.WriteEndElement();//end rowname 
        writer.WriteStartElement("rcount"); 
        writer.WriteString(Convert.ToString(sdr["rcount"])); 
        writer.WriteEndElement();//end rcount 
        writer.WriteEndElement();//end AuditHistory 
       } 
      } 
      writer.WriteEndElement();// end root 
      writer.WriteEndDocument(); 
      writer.Flush(); 
     } 

更新

あなたが応答にXMLを記述しようとしているので、あなたはXmlWriter.CreateメソッドにResponse.Outputストリームを渡すことができますし、それは任意のメモリの問題を解消します。

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 
using (XmlWriter writer = XmlWriter.Create(context.Response.OutputStream, settings)) 
{ 
    // write the results of the sql query to the writer... 
} 
+0

私は、この内部のブラウザでダウンロードファイル私は1つのボタンをクリックし、ブラウザinside.i利用asp.netでダウンロードする第1の方法は、応答にすることができますバイナリ書き込みデータを爆破しない場合は、私のrequirment – PParmar

+0

です。それ以外の場合は、メモリストリームを使用する代わりに、応答出力ストリームを 'XmlWriter.Create'に渡してレスポンスに直接書き込むことができ、メモリの問題は発生しません。 –

+0

私は2000000データをこのコードの中に書いていません。私は大きなデータセット内にメモリストリームを書き込むのは限られていません。 – PParmar

関連する問題