SQL服务器:服务器侧blob标?
-
20-08-2019 - |
题
我想读的二进制数据从一个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);