1

我想从 blob 中读取二进制数据,使用它周围的 Stream 接口。

但我不希望 Blob 必须完全加载到客户端并存储在内存或文件中。

我希望使用 blob 的代码能够查找和读取,并且仅通过网络传输支持查找/读取所需的尽可能多的数据。

假装blob 是一个 250MB 的 Photoshop 图像。缩略图代码知道如何读取图像的前 8 个字节,识别它是 PSD 文件,寻找包含 3k 缩略图的偏移量,然后读取它。

因此,与其尝试分配 250MB 的内存,或者必须创建一个临时文件,也不必等待 250MB 通过网络传输:假设的 SQLServerBlobStreamServerCursor 类知道如何将数据流量传输到实际请求的数据。


研究

如何:通过在 ADO.NET 和 Visual Basic .NET 中使用分块读取和写入文件到 BLOB 列, 其中谈到能够以块的形式读取和写入。但是代码是不可读的被切断,我无法忍受。我稍后再看。

这个人还提到了一种新的 SQL Server 2005 [ column .Write()]3 T-SQL 语法来写入数据 -可用于以小块写入数据(以避免消耗所有服务器的内存)。也许有一个[]。Read () 伪方法

微软有一篇文章:Conserving Resources When Writing BLOB Values to SQL Server

4

3 回答 3

2

使用较新版本的 SQL Server,您可以在二进制数据类型和文本上使用带有 SUBSTRING() 函数的纯 SQL。请参阅http://msdn.microsoft.com/en-us/library/ms187748.aspx

要获取图像的大小:

select datalength(blobcolumn) from myimages where imgid = 12345;

读取前 8 个字节:

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

要读取 877 个字节,偏移 115000 到 115876:

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

请记住,子字符串函数基于 1 偏移量,而不是 0。

如果您关心列在读取部分之间可能会发生变化,您可以将所有不同的选择放在事务中。

这未经我测试,但旧版本的 MS SQL Server 显然需要使用(现已弃用)READTEXT 动词和 TEXTPTR() 函数。如:

select textptr(blobcolumn) from myimages where imgid = 12345;

获取返回的指针值,比如 PTR,并在后续查询中使用它:

readtext blobcolumn @PTR 115001 887
于 2009-08-11T21:11:46.420 回答
1

您可以考虑为此使用新的 Sql Server 2008 FileStream 功能:http: //msdn.microsoft.com/en-us/library/cc645940.aspx

于 2010-12-13T14:14:17.977 回答
0

您将希望将 ADO.NET 的SqlDataReader对象与SequentialAccessCommandBehavior 一起使用。这将允许您定义缓冲区大小并以块的形式读取数据。

请参阅这篇文章: http: //msdn.microsoft.com/en-us/library/87z0hy49 (VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
于 2009-01-29T19:34:35.733 回答