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 numa base de dados directamente num controlo PictureBox num formulário Windows sem ter de guardar a imagem para um ficheiro.
No Microsoft Visual Basic 6.0, a única forma de apresentar uma imagem a partir de uma base de dados num controlo PictureBox , sem o ponto intermédio de guardar os objectos grandes binários {BLOB) dados num ficheiro, deve ligar PictureBox a uma origem de dados como um controlo de ActiveX Data Objects (ADO) de dados ou conjunto de registos. Não é possível (sem ligação de dados) para carregar programaticamente um BLOB para um controlo sem guardar a imagem para um ficheiro para utilização pela instrução LoadPicture.
Neste artigo, utilizaremos o objecto MemoryStream da classe base System.IO para copiar os dados imagem da base de dados directamente para o controlo 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 o Visual Studio .NET e crie um novo Visual C# Windows Application Project.
Adicione uma PictureBox e dois controlos do botão para a predefinição Form1 da caixa de ferramentas. Defina a propriedade texto de Button1 para ficheiro de base de dados e a propriedade de texto de Button2 a base de dados para PictureBox .
Inserir as seguintes instruções utilizando na parte superior do módulo de código do formulário:
using System.Data.SqlClient;
using System.IO;
using System.Drawing.Imaging;
Adicionar a declaração seguinte para a cadeia de ligação de base de dados apenas inside o pública classe Form1: System.Windows.Forms.Form declaração de classe e ajustar a cadeia de ligação conforme necessário:
Insira o seguinte código no procedimento de evento clicar de Button1 ( ficheiro de base de dados ). Ajuste o caminho de ficheiro para um ficheiro de imagem de exemplo disponível conforme necessário. Este código de ler o ficheiro de imagem a partir do disco (utilizando um objecto de FileStream ) para uma matriz de bytes e, em seguida, insere os dados da base de dados utilizando um objecto de comando com parâmetros. 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 clicar de Button2 ( base de dados para PictureBox ). Este código copia as linhas da tabela BLOBTest na base de dados para um DataSet , cópias mais recentemente adicionadas imagem para uma matriz de bytes e, em seguida, para um objecto MemoryStream e, em seguida, carrega MemoryStream para a propriedade de imagem do controlo 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);}
Prima F5 para compilar e executar o projecto.
Clique no botão ficheiro a base de dados para carregar, pelo menos, uma imagem de exemplo para a base de dados.
Clique no botão da base de dados para PictureBox para apresentar a imagem guardada no controlo PictureBox .
Se pretender conseguir inserir a imagem do controlo PictureBox directamente na base de dados, adicionar um terceiro botão de controlo e insira o seguinte código no respectivo procedimento de evento clicar. Este código obtém os dados imagem do controlo PictureBox num objecto MemoryStream copia MemoryStream para uma matriz de bytes e, em seguida, guarda a matriz de bytes a base de dados utilizando um objecto 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 projecto. Clique no botão da base de dados para PictureBox para apresentar uma imagem guardada anteriormente no controlo PictureBox . Clique no botão recentemente para guardar a imagem de PictureBox na base de dados. Em seguida, clique no botão da base de dados para PictureBox novamente para confirmar que a imagem foi guardada correctamente.
Este teste não funcionará com a coluna fotografias na tabela empregados dos dados de exemplo Adamastor distribuídos com o Access e SQL Server. As imagens de mapa de bits armazenadas na coluna fotografias são moldadas com as informações de cabeçalho criada pelo controlo do Visual Basic 6.0 OLE contentor.
Se necessitar de utilizar uma base de dados do Access para testar este código, é necessário criar a coluna na tabela do Access como tipo de Objecto OLE e utilizar o espaço de nomes System.data.OLEDB com o fornecedor Microsoft Jet 4.0 em vez do espaço de nomes System.data.SqlClient .
Para obter informações adicionais sobre como utilizar dados do BLOB com o Visual C#. NET, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
309158
(http://support.microsoft.com/kb/309158/
)
COMO: Ler e escrever dados BLOB utilizando ADO.NET com o Visual C# .NET
317016
(http://support.microsoft.com/kb/317016/
)
Como ler e escrever um ficheiro ou para uma coluna BLOB utilizando o ADO.NET e Visual C# .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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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
O que podemos fazer para melhor estas informações?
Para proteger a sua privacidade, não inclua as informações de contacto nos comentários.
Obrigado! Os seus comentários serão utilizados para nos ajudar a melhorar o conteúdo do suporte. Para obter mais opções de assistência, visite a Home Page da Ajuda e Suporte.