SQL Server:服务器端blob游标?

时间:2009-01-29 19:16:27

标签: .net sql-server binary-data

我想从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

3 个答案:

答案 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);
相关问题