我想从blob中读取二进制数据,使用它周围的Stream接口。
但我不希望blob必须完全加载到客户端并存储在内存或文件中。
我希望使用blob的代码能够搜索和读取,并且只有支持搜索/读取所需的数据才能通过网络传输。
即。 假装 blob是一个250MB的Photoshop图像。缩略图代码知道如何读取图像的前8个字节,识别它是PSD文件,寻找包含3k缩略图的偏移量,并读取它。
因此,不是试图分配250MB内存,或者必须创建一个临时文件,而是必须等待250MB才能通过网络:假设的SQLServerBlobStreamServerCursor类知道如何将流量数据传输到实际需要的内容
HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual Basic .NET 其中讨论了能够以块状读取和写入的内容。但代码是不可读的被切断,就像我无法忍受它。我稍后会看。
同样this guy提到了一个新的SQL Server 2005 [列 .Write()] 3 T-SQL语法来写数据 - could be used to write data in small chunks(以避免消耗所有服务器的记忆)。也许有一个[列]。读取()伪方法
Microsoft有一篇文章:Conserving Resources When Writing BLOB Values to SQL Server
答案 0 :(得分: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
答案 1 :(得分:1)
您可以考虑使用新的Sql Server 2008 FileStream功能:http://msdn.microsoft.com/en-us/library/cc645940.aspx
答案 2 :(得分:0)
您将希望将ADO.NET的SqlDataReader
对象与SequentialAccess
CommandBehavior一起使用。这将允许您定义缓冲区大小并以块的形式读取数据。
请参阅此文章: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);