我有一个C#应用程序需要向SQL Server数据库添加大量文本(一行最多可以有1GB的文本)。所以,我有一些看起来像的代码:
SqlParameter param = command.Parameters.Add("@text", SqlDbType.NVarChar);
param.Value = new string(buffer);
文本以块的形式添加,因此缓冲区为20 MB。我试图通过重新使用缓冲区来减少内存压力(而不是每次我需要添加块时执行新的char [10000000])。我注意到的是ADO.NET似乎每次调用我的sproc时都会分配一个新的缓冲区。每次调用sproc时,我都会看到我的进程的工作集几乎上升了20 MB。
现在,您可能认为这是因为“新字符串(缓冲区)”(我做过),但是当我这样做时我会得到相同的行为
param = command.Parameters.Add("@text", SqlDbType.Text, buffer.Length);
param.Value = buffer;
有没有办法阻止ADO.NET每次向数据库添加一大块文本时都进行额外的内存分配?
谢谢!
答案 0 :(得分:0)
如果您将SqlDbType.VarBinary
与byte[]
数组一起使用,则ADO.NET将使用您提供的缓冲区而不进行复制。