我想读的二进制数据从一个blob,使用流的接口。

但我不想blob到必须加载完全客户端和存储器中存储或在一个文件。

我想代码使用的blob能够寻求并阅读,只有尽可能多的数据需要支持寻求/读出来过电线。

假装 blob是250MB Photoshop图像。该thumbnailer码知道如何阅读的第8字节的图像,认识到这是一个PSD文件,寻求所抵消,将包含3k略,并阅读。

因此,而不是试图分配250MB的存储器,或具有创建一个临时文件,并具有等待250MB要带过来的线:假设SQLServerBlobStreamServerCursor类知道如何数据的交通为什么这实际上是提出的要求。


研究

如何:阅读和书写的文件,并从BLOB列通过使用在分块ADO.NET 和视觉基础。净 其中谈能够读和写,在大块。但是代码是不可读的被切断那样的我不能忍受它。我会看看它后面。

这个家伙 提到的一个新的SQL服务器2005年[.Write()]3T-SQL法编写的数据 可以用来编写的数据,在小块 (避免耗费的所有服务器的存储器)。也许有一个[].阅读()伪的方法

Microsoft具有文章: 节约资源的时候写BLOB值到SQL服务器

有帮助吗?

解决方案

使用SQL服务器的新版本,你可以只使用纯SQL与二进制数据类型以及文本的SUBSTRING()函数。 请参见 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个字节,通过115876偏移115000:

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

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

如果你所关心的列的读出它部分之间潜在地改变,就可以把一个事务中的所有不同的选择。

这是我的未经检验的,但旧版本的MS SQL服务器显然需要使用(废弃)READTEXT动词和TEXTPTR()函数。如:

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

抓住返回的指针值,说PTR,并在随后的查询中使用它:

readtext blobcolumn @PTR 115001 887

其他提示

您可以考虑使用这一新的SQL Server 2008 FILESTREAM功能: HTTP:/ /msdn.microsoft.com/en-us/library/cc645940.aspx

您将要使用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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top