Pergunta

i gostaria de ler dados binários a partir de um blob, usando a interface de fluxo em torno dele.

Mas eu não quero o blob ter que ser carregado inteiramente do lado do cliente e armazenado na memória, ou em um arquivo.

eu quero o código que usa o blob para ser capaz de procurar e ler, e apenas a quantidade de dados que são necessários para apoiar procuram / leitura é trazido sobre o fio.

i. Finja o blob é uma imagem de 250 MB Photoshop. O código thumbnailer sabe ler os primeiros 8 bytes de uma imagem, reconhecer que é um arquivo PSD, procuram o deslocamento que irá conter a miniatura 3k, e ler isso.

Então, ao invés de tentar alocar 250MB de memória, ou ter que criar um arquivo temporário, e ter que esperar por 250MB para ser trazido ao longo do fio: a classe SQLServerBlobStreamServerCursor hipotética sabe como tráfego de dados para o que é realmente pediu para .


Research

COMO: Ler e gravar um arquivo para e de uma coluna BLOB utilizando Chunking no ADO.NET e Visual Basic .NET Que fala sobre ser capaz de ler e escrever, em pedaços. Mas o código é ilegível ser cortado como que eu não posso suportar isso. eu vou olhar para ele mais tarde.

esse cara mencionado um novo SQL Server 2005 [< em> coluna .Write ()] 3 T-SQL sintaxe para gravar dados - poderia ser usado para gravar dados em pequenos pedaços (para evitar o consumo de memória tudo do seu servidor). Talvez haja uma [ coluna ]. Leia () pseudo-método

A Microsoft tem um artigo: conservação dos recursos Quando Escrita BLOB Os valores para o SQL Server

Foi útil?

Solução

Com as versões mais recentes do SQL Server você pode apenas usar SQL simples com a função SUBSTRING () em tipos de dados binários, bem como texto. Consulte http://msdn.microsoft.com/en-us/library/ms187748 aspx

Para obter o tamanho da imagem:

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

Para ler os primeiros 8 bytes:

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

Para ler 877 bytes, offset 115000 através 115876:

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

Lembre-se que a função substring é baseado em um 1-offset, não 0.

Se você se preocupa com a coluna potencialmente mudando entre a leitura de partes do mesmo, você pode colocar todos os diferentes seleciona dentro de uma transação.

Este não foi testado por mim, mas versões mais antigas do MS SQL Server, aparentemente, requerem o uso da função (agora obsoleto) READTEXT verbo e TEXTPTR (). Tais como:

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

agarrar o valor ponteiro retornado, dizem PTR, e usá-lo nas consultas subsequentes:

readtext blobcolumn @PTR 115001 887

Outras dicas

Você pode considerar o uso de novo recurso FileStream Sql Server 2008 para este: http: / /msdn.microsoft.com/en-us/library/cc645940.aspx

Você vai querer usar objeto SqlDataReader do ADO.NET com o SequentialAccess CommandBehavior. Isso permitirá que você para definir um tamanho de buffer e ler os dados em blocos.

Veja este artigo: 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top