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.
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 .
Criar uma tabela SQL Server ou do Access com a seguinte estrutura:
CREATE TABLE BLOBTest
(
BLOBID INT IDENTITY NOT NULL,
BLOBData IMAGE NOT NULL
)
Abra Visual Studio.NET e crie um novo Visual translation from VPE for Csharp Windows projeto de aplicativo.
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 .
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;
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:
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);}
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);}
Pressione F5 para compilar e executar o projeto.
Clique no botão arquivo para o banco de dados para carregar pelo menos uma imagem de exemplo para o banco de dados.
Clique no botão banco de dados para PictureBox para exibir a imagem salva no controle PictureBox .
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);}
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.
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 .
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
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/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
Diga-nos o porque e o que podemos fazer para melhorar esta informação
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.