英文:
Efficient way to store the DeflateStream result to `byte[]`?
问题
我正在将 SQL 服务器表中的 varbinary(MAX)
读入 byte[] content
变量中。然后使用 DeflateStream
解压缩内容。最终目标是将解压缩的内容分配给另一个 byte[]
数组,然后将其存储到 SQL 表中。
问题的核心是如何分配输出的 byte[]
数组以及如何将解压缩的结果分配给它。到目前为止,我正在使用另一个 MemoryStream
和其 .ToArray()
方法来分配结果,就像这样:
byte[] content = row.Field<byte[]>("Content");
using (var memstream = new MemoryStream(content, 0, content.Length))
using (var defstream = new DeflateStream(memstream, CompressionMode.Decompress))
using (var outstream = new MemoryStream())
{
defstream.CopyTo(outstream);
byte[] deflated = outstream.ToArray();
// ... 将压缩后的结果写入 SQL 表中。
}
这是一个合理高效的解决方案吗?还是有更清晰的方法将 DeflateStream
的结果保存到 byte[]
中?
我知道 DeflateStream
实现了 .Read(buffer, 0, bufferSize)
。然而,结果的大小事先是未知的。
上下文: 压缩的内容是 JPEG 或 PNG 格式的产品图像。因此,这个图像会再次被 Microsoft 压缩。
英文:
I am reading the varbinary(MAX)
from the SQL server table into the byte[] content
variable. Then the DeflateStream
is used to unpack the content. The final goal is to assign the unpacked content to another byte[]
array, and then store it into the SQL table.
The core of the question is how to allocate the output byte[]
array and how to assign the result of deflating into it. So far, I am using another MemoryStream
and its .ToArray()
method to assign result, like this:
byte[] content = row.Field<byte[]>("Content");
using (var memstream = new MemoryStream(content, 0, content.Length))
using (var defstream = new DeflateStream(memstream, CompressionMode.Decompress))
using (var outstream = new MemoryStream())
{
defstream.CopyTo(outstream);
byte[] deflated = outstream.ToArray();
// ... write the deflated result to the SQL table.
}
Is that a reasonably efficient solution? Or is there a cleaner way to save the DeflateStream
result to byte[]
?
I know that the DeflateStream
implements the .Read(buffer, 0, bufferSize)
. However, the size of the result is not known in advance.
Context: The compressed content is a product image in JPEG or PNG. For the reason, the image is compressed once again by Microsoft.
答案1
得分: 1
只需将流直接传递给您的命令参数的 Value
。
注意: 在命令执行之前,请不要使用 using
处理流。
byte[] content = row.Field<byte[]>("Content");
using (var memstream = new MemoryStream(content))
using (var defstream = new DeflateStream(memstream, CompressionMode.Decompress))
{
command.Parameters.Add("@yourVarBinary", SqlDbType.VarBinary, -1).Value = defstream;
command.ExecuteNonQuery.....
}
假设 row.Field
实际上是一个 SqlDataReader
,您可以在两个方向上这样做。
using (var stream = row.GetStream(row.GetOrdinal("Content")))
using (var defstream = new DeflateStream(stream, CompressionMode.Decompress))
{
command.Parameters.Add("@yourVarBinary", SqlDbType.VarBinary, -1).Value = defstream;
command.ExecuteNonQuery.....
}
另请参阅文档。
英文:
You can just pass the stream directly as the Value
for your command's parameter.
Note: do not dispose the stream with using
until the command has been executed.
byte[] content = row.Field<byte[]>("Content");
using (var memstream = new MemoryStream(content))
using (var defstream = new DeflateStream(memstream, CompressionMode.Decompress))
{
command.Parameters.Add("@yourVarBinary", SqlDbType.VarBinary, -1).Value = defstream;
command.ExecuteNonQuery.....
}
Assuming row.Field
is actually a SqlDataReader
, you can do this in both directions.
using (var stream = row.GetStream(row.GetOrdinal("Content")))
using (var defstream = new DeflateStream(stream, CompressionMode.Decompress))
{
command.Parameters.Add("@yourVarBinary", SqlDbType.VarBinary, -1).Value = defstream;
command.ExecuteNonQuery.....
}
See also the documentation.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论