代码之家  ›  专栏  ›  技术社区  ›  Chris

有效地向数据库添加大量文本

  •  1
  • Chris  · 技术社区  · 15 年前

    我有一个C应用程序需要向SQL Server数据库添加大量文本(一行最多可以包含1GB的文本)。所以,我有一些代码看起来像:

    SqlParameter param = command.Parameters.Add("@text", SqlDbType.NVarChar);
    param.Value = new string(buffer);
    

    文本是分块添加的,所以缓冲区就是20 MB。我试图通过重新使用缓冲区来降低内存压力(而不是每次需要添加块时都做一个新的char[10000000])。我注意到ADO.NET似乎每次调用存储过程时都在分配一个新的缓冲区。每次调用存储过程时,我都会看到进程的工作设置增加了几乎20 MB。

    现在,您可能认为这是因为“new string(buffer)”(我做了),但是当我做的时候,我会得到相同的行为。

    param = command.Parameters.Add("@text", SqlDbType.Text, buffer.Length);
    param.Value = buffer;
    

    是否有任何方法可以阻止ADO.NET在每次向数据库添加文本块时进行额外的内存分配?

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  0
  •   Chris    15 年前

    如果你使用 SqlDbType.VarBinary 用一个 byte[] 数组,那么ADO.NET将使用您提供的缓冲区而不进行复制。