C# 如何将对象图作为xml高效地流式传输到sql server

C# 如何将对象图作为xml高效地流式传输到sql server,c#,sql,xml-serialization,C#,Sql,Xml Serialization,我有一个需要序列化为xml并保存到Sql Server行的对象图。我有一个xml数据类型的表,我一直在使用SqlXml数据类型,为它提供了一个memorystream 这在很大程度上是有效的。然而,如果我的对象图特别大(大约200兆),我会得到一个OutOfMemoryException。将对象图序列化为xml并将其流式传输到Sql Server的最有效方法是什么?这是我现在的代码: using (MemoryStream ms = new MemoryStream()) { using

我有一个需要序列化为xml并保存到Sql Server行的对象图。我有一个xml数据类型的表,我一直在使用SqlXml数据类型,为它提供了一个memorystream

这在很大程度上是有效的。然而,如果我的对象图特别大(大约200兆),我会得到一个OutOfMemoryException。将对象图序列化为xml并将其流式传输到Sql Server的最有效方法是什么?这是我现在的代码:

using (MemoryStream ms = new MemoryStream())
{
    using (SqlConnection connection = new SqlConnection(this.Settings.GetConnectionString()))
    {
    connection.Open();

    SqlCommand command = connection.CreateCommand();

    command.CommandText = "INSERT_MESSAGE";
    command.CommandType = System.Data.CommandType.StoredProcedure;

    SqlParameter param = command.CreateParameter();
    param.ParameterName = "@PARTITION_ID";
    param.Direction = System.Data.ParameterDirection.Input;
    param.DbType = System.Data.DbType.Int32;
    param.Value = this.PartitionId;
    command.Parameters.Add(param);

    param = command.CreateParameter();
    param.ParameterName = "@MESSAGE";
    param.Direction = System.Data.ParameterDirection.Input;
    param.DbType = System.Data.DbType.Xml;

    XmlSerializer xs = new XmlSerializer(typeof(MessageContext));
    xs.Serialize(ms, message);
    param.Value = new System.Data.SqlTypes.SqlXml(ms);

    command.Parameters.Add(param);

    param = command.CreateParameter();
    param.ParameterName = "@RETURN_VALUE";
    param.Direction = System.Data.ParameterDirection.ReturnValue;
    param.DbType = System.Data.DbType.Int32;
    command.Parameters.Add(param);

    command.ExecuteNonQuery();

    if ((int)command.Parameters["@RETURN_VALUE"].Value == 1)
        throw new IntegrationSystemException("Unknown error encountered while selecting the record count");
    else
    {
        if (log.IsInfoEnabled)
        log.InfoFormat("Saved message [{0}]", message.MessageId);
    }
    }
}
我正在考虑使用一个“杂交流”,比如这里:。这基本上是将MemoryStream分配给某个任意限制,当达到该限制时,它会为剩余的内存创建一个文件流


优化帮助将不胜感激。

对于大型对象图,请尝试首先序列化到磁盘上的文件,然后将文件流传递到SqlXmL。

我将使用HybridStream方法-我认为它提供了两个方面的最佳效果-小文件的高性能内存流(所有事务的90%)但是对于那些大的文件流来说,文件流的安全性很高。