ID do artigo: 317701 - Última revisão: segunda-feira, 5 de abril de 2004 - Revisão: 2.5

COMO: Copiar uma imagem de um banco de dados diretamente para um controle PictureBox com translation from VPE for Csharp Visual

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo passo a passo descreve como copiar uma imagem armazenada em um banco de dados diretamente em um controle PictureBox em um formulário do Windows sem precisar salvar a imagem em um arquivo.

No Microsoft Visual Basic 6.0, a única maneira de exibir uma imagem de um banco de dados em um controle PictureBox , sem a etapa intermediária de salvar o objeto binário grande {BLOB) dados para um arquivo, é ligar o PictureBox a uma fonte de dados, como um controle de dados do ActiveX Data Objects (ADO) ou Recordset. Não é possível (sem ligação de dados) para carregar programaticamente um BLOB em um controle sem salvar a imagem em um arquivo para uso pela instrução LoadPicture.

Neste artigo, usaremos o objeto MemoryStream da classe base System.IO para copiar os dados da imagem do banco de dados diretamente no controle PictureBox .


Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que será necessário:
  • Microsoft Visual Studio .NET instalado em um compatível com sistema operacional Microsoft Windows
  • Uma instância disponível do Microsoft SQL Server ou um banco de dados disponível do Microsoft Access para teste
Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
  • Aplicativos translation from VPE for Csharp .NET Windows Forms Visual
  • Armazenamento (BLOB) grande objeto binário em bancos de dados
  • Acesso a dados ADO.NET

Exemplo

  1. Criar uma tabela SQL Server ou do Access com a seguinte estrutura:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Abra Visual Studio.NET e crie um novo Visual translation from VPE for Csharp Windows projeto de aplicativo.
  3. Adicione um PictureBox e dois controles Button para o Form1 padrão da caixa de ferramentas. Defina a propriedade Text de Button1 para arquivo para o banco de dados e a propriedade Text de Button2 ao banco de dados para PictureBox .
  4. Insira as seguintes instruções using na parte superior do módulo de código do formulário:
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    					
  5. Adicione a declaração a seguir para a seqüência de conexão banco de dados apenas todos o public class Form1: System.Windows.Forms.Form declaração de classe e ajustar a seqüência de conexão conforme necessário:
        String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
    					
  6. Insira o seguinte código no procedimento de evento Click do Button1 ( arquivo para o banco de dados ). Ajuste o caminho do arquivo para um arquivo de imagem disponíveis exemplo conforme necessário. Esse código lê o arquivo de imagem do disco (usando um objeto FileStream ) em uma matriz byte e, em seguida, insere os dados no banco de dados usando um objeto com parâmetros de comando . Tente
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd =  new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    	String strBLOBFilePath = @"C:\blue hills.jpg";//Modify this path as needed.
    
    	//Read jpg into file stream, and from there into Byte array.
    	FileStream fsBLOBFile =  new FileStream(strBLOBFilePath,FileMode.Open, FileAccess.Read);
    	Byte[] bytBLOBData = new Byte[fsBLOBFile.Length]; 
    	fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);
    	fsBLOBFile.Close();
    
    	//Create parameter for insert command and add to SqlCommand object.
    	SqlParameter prm = new  SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    				0, 0, null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    
    	//Open connection, execute query, and close connection.
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  7. Insira o seguinte código no procedimento de evento Click de Button2 ( banco de dados para PictureBox ). Este código recupera as linhas da tabela BLOBTest no banco de dados em um DataSet , cópias mais recentemente adicionadas imagem em uma matriz byte e, em seguida, em um objeto MemoryStream e, em seguida, carrega MemoryStream para a propriedade Image do controle PictureBox . Tente
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	cn.Open();
    
    	//Retrieve BLOB from database into DataSet.
    	SqlCommand cmd = new SqlCommand("SELECT BLOBID, BLOBData FROM BLOBTest ORDER BY BLOBID", cn);	
    	SqlDataAdapter da = new SqlDataAdapter(cmd);
    	DataSet ds = new DataSet();
    	da.Fill(ds, "BLOBTest");
    	int c = ds.Tables["BLOBTest"].Rows.Count;
    
    	if(c>0)
    	{   //BLOB is read into Byte array, then used to construct MemoryStream,
    		//then passed to PictureBox.
    		Byte[] byteBLOBData =  new Byte[0];
    		byteBLOBData = (Byte[])(ds.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]);
    		MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
    		pictureBox1.Image= Image.FromStream(stmBLOBData);
    	} 
    	cn.Close();
    }
    catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  8. Pressione F5 para compilar e executar o projeto.
  9. Clique no botão arquivo para o banco de dados para carregar pelo menos uma imagem de exemplo para o banco de dados.
  10. Clique no botão banco de dados para PictureBox para exibir a imagem salva no controle PictureBox .
  11. Se você deseja ser capaz de inserir a imagem do controle PictureBox diretamente no banco de dados, adicione um terceiro controle Button e insira o código a seguir no seu procedimento de evento Click. Este código recupera os dados da imagem do controle PictureBox em um objeto MemoryStream , copia MemoryStream para uma matriz byte e, em seguida, salva a matriz de bytes o banco de dados usando um objeto de comando com parâmetros. Tente
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    
    	//Save image from PictureBox into MemoryStream object.
    	MemoryStream ms  = new MemoryStream();
    	pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
    
    	//Read from MemoryStream into Byte array.
    	Byte[] bytBLOBData = new Byte[ms.Length];
    	ms.Position = 0;
    	ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
    
    	//Create parameter for insert statement that contains image.
    	SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    					0, 0,null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception  ex)
     {MessageBox.Show(ex.Message);}
    					
  12. Execute o projeto. Clique no botão banco de dados para PictureBox para exibir uma imagem salva anteriormente no controle PictureBox . Clique no botão para salvar a imagem da PictureBox para o banco de dados recém-adicionado. Em seguida, clique no botão banco de dados para PictureBox novamente para confirmar que a imagem foi salva corretamente.

Armadilhas

  • Esse teste não funcionará com a coluna Photo na tabela funcionários do exemplo banco de dados Northwind distribuído com o Access e o SQL Server . As imagens de bitmap armazenadas na coluna Photo são empacotadas com as informações de cabeçalho criadas pelo Visual Basic 6.0 controle OLE Container.
  • Se você precisar usar um banco de dados do Access para testar esse código, você precisará criar a coluna na tabela do Access como tipo de Objeto OLE e usar o namespace System.Data.OLEDB com o Microsoft Jet 4.0 Provider no lugar do namespace System.Data.SqlClient .

Referências

Para informações adicionais sobre como usar dados BLOB com .NET translation from VPE for Csharp Visual, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
309158  (http://support.microsoft.com/kb/309158/ ) COMO: Ler e gravar dados BLOB usando o ADO.NET com o Visual translation from VPE for Csharp .NET
317016  (http://support.microsoft.com/kb/317016/ ) Como ler e gravar um arquivo ou de uma coluna BLOB usando ADO.NET e Visual translation from VPE for Csharp .NET

A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbdatabinding kbhowtomaster KB317701 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 317701  (http://support.microsoft.com/kb/317701/en-us/ )