0

ローカル ディスクに大きな XML ファイル (範囲 150 MB) があり、ADO.NET を使用してそれを nvarchar(max) 列に配置しています。コードは次のようになります (大幅に編集されているため、コードの関連部分のみを残します)。

using ( var fileStream = new FileStream( myfile , FileMode.Open , FileAccess.Read , FileShare.Read ) )
{
// prep sqlconnection...
sqlCon.Open();
var sqlCommand = new SqlCommand();      
sqlCommand.Connection = sqlCon;
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = "[dbo].[bigsproc]";
var param1 = new SqlParameter( "@doc" , SqlDbType.NVarChar , Int32.MaxValue );
param1.Value = new SqlXml( fileStream );
sqlCommand.Parameters.Add( param1 );
var syncResult = sqlCommand.ExecuteNonQuery();

私はこの問題を抱えています:

ExceptionBody:System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.IO.MemoryStream.set_Capacity(Int32 value)
   at System.IO.MemoryStream.EnsureCapacity(Int32 value)
   at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.Xml.XmlEncodedRawTextWriter.EncodeChars(Int32 startOffset, Int32 endOffset, Boolean writeAllToStream)
   at System.Xml.XmlEncodedRawTextWriter.FlushBuffer()
   at System.Xml.XmlEncodedRawTextWriter.RawText(Char* pSrcBegin, Char* pSrcEnd)
   at System.Xml.XmlEncodedRawTextWriter.RawText(String s)
   at System.Xml.XmlEncodedRawTextWriter.WriteStartElement(String prefix, String localName, String ns)
   at System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns)
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at System.Data.SqlTypes.SqlXml.CreateMemoryStreamFromXmlReader(XmlReader reader)
   at System.Data.SqlTypes.SqlXml..ctor(XmlReader value)
   at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
   at System.Data.SqlClient.SqlParameter.GetCoercedValue()
   at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
   at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters)
   at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

この大規模なディスクベースの XML をリモート DB サーバーに取り込む最善の方法は何ですか?

ありがとう。

4

1 に答える 1

0

SQL 接続オブジェクトが Using ステートメントに含まれていない場合のように、オブジェクトが破棄されていない場合、メモリ不足の例外が発生します + SqlCommand クラスも IDisposable です。

これは、毎回発生するメモリ オーバーフロー クラッシュではない可能性があります。しかし、メモリがオーバーフローすると問題が発生します...

于 2012-01-26T19:55:39.687 に答える