Como você inserir um arquivo (PDF) em uma coluna varbinary SQL Server e mais tarde recuperá-la?

StackOverflow https://stackoverflow.com/questions/443635

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu estou olhando para tomar os resultados de uma corrida relatório (um arquivo PDF a partir de Crystal Reports), serializá-lo, colocá-lo em um campo varbinary, e depois ser capaz de desserializar-lo e apresentá-lo de volta para o usuário.

Por agora eu tenho que simplesmente velho ADO .NET (SqlClient, SqlCommand, etc.)

Existem armadilhas para isso? O que é a sintaxe básica para alcançar este objetivo dado o fato de que eu saberia o caminho na máquina local onde o arquivo PDF foi salvo no momento?

Foi útil?

Solução

EDIT: Apenas visto na MSDN que imagem vai ser removida . Melhor uso de uso VARBINARY (MAX). (Ei, eu não sabia que).

A minha resposta VELHO: VARBINARY tem um limite de 8 KB. Pode ser muito pequeno para armazenar PDF do. É melhor usar o tipo de dados IMAGE.

Utilize parâmetros para inserir / selecionar seus dados através do SqlCommand, e você pode usar SQL simplesmente como qualquer campo comum.

Os dados que passam para o campo de imagem é um array de bytes.

Edit 2: Uma vez que você estiver usando C #, você deve recuperar os dados usando um DataReader. Para criar o DataReader usar o sinalizador SequentialAccess na SqlCommand.ExecuteReader , para evitar que os dados que está sendo lido na memória muito cedo.

Outras dicas

Eu realmente não iria usar um parâmetro byte[] a um IDbCommand em tudo. E se o seu PDF é de 100 Mb grande? Tanto quanto eu sei, isso iria receber todos os 100 Mb de seu banco de dados (precisando que a quantidade de memória no seu servidor) antes de enviar o resultado para o navegador solicitante. Agora pense sobre a obtenção de um número de solicitações simultâneas para diferentes PDFs de aproximadamente deste tamanho ... por segundo ... Isso não é muito escalável.

Para uma possível solução, confira "Blob + Fluxo = BlobStream" , um artigo que escrevi para o .NET Revista aqui na Holanda um par de anos atrás. Este método usa comandos do SQL Server para acessar partes de um BLOB de uma classe derivada Stream.

O artigo é em holandês, mas o exemplo código que vai com ele deve ser suficiente para você começar. Além disso, Peter De Jonghe parece ter escrito um artigo href="http://www.codeproject.com/KB/database/LobStreamFrameworkPart1.aspx" em CodeProject que se expande em meu artigo um pouco, generalizando-lo para mais do que apenas colunas image em SQL Server. Este artigo está em Inglês.

Espero que isso ajude você com seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top