I'm developing an inventory control application and in this application there is a product registration screen:
TheimagesoftheproductsarebeingsavedintheMySQLdatabase.Ireceivedsometipsanditwasnotrecommendedtosaveimagesinthedatabase,becausetheproductsearchfieldonthequeryscreenwasveryslowbecausetheimageisconvertedintoabyteasfollows:
publicvoidCarregaImagem(StringimgCaminho){try{if(string.IsNullOrEmpty(imgCaminho))return;//fornecepropriedadesemétodosdeinstânciaparacriar,copiar,//excluir,mover,eabrirarquivos,eajudanacriaçãodeobjetosFileStreamFileInfoarqImagem=newFileInfo(imgCaminho);//ExpõeumStreamaoredordeumarquivodesuporte//síncronoeassíncronooperaçõesdeleituraegravar.FileStreamfs=newFileStream(imgCaminho,FileMode.Open,FileAccess.Read,FileShare.Read);//alocamemóriaparaovetorthis.ProFoto=newbyte[Convert.ToInt32(arqImagem.Length)];//Lêumblocodebytesdofluxoegravaosdadosemumbufferfornecido.intiBytesRead=fs.Read(this.ProFoto,0,Convert.ToInt32(arqImagem.Length));fs.Close();}catch(Exceptionex){thrownewException(ex.Message.ToString());}}
Andsavedtothebankasfollows:
publicvoidIncluir(ModeloProdutoobj){MySqlCommandcmd=newMySqlCommand();cmd.Connection=conexao.ObjetoConexao;cmd.CommandText="insert into Produto (pro_foto) " +
"values (@foto); select @@IDENTITY;";
cmd.Parameters.Add("@foto", MySqlDbType.LongBlob);
if (obj.ProFoto == null)
{
//cmd.Parameters.AddWithValue("@pro_foto", DBNull.Value);
cmd.Parameters["@foto"].Value = DBNull.Value;
}
else
{
//cmd.Parameters.AddWithValue("@pro_foto", obj.pro_foto);
cmd.Parameters["@foto"].Value = obj.ProFoto;
}
}
On the query screen, the image is passed from the database to the PictureBox when the user types the name or bar code of the product. But I would like to change that. Instead of saving the image in the database, when the user registers a product and clicks to save, the image will be automatically passed from the PictureBox of the registration screen to a directory inside the program folder and when doing a search on the screen the image to be retrieved from the directory for the PictureBox. The image is also saved with the product code number at the time of registration.
"Add Photo" button on the registration screen:
private void btLoFoto_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog od = new OpenFileDialog();
od.ShowDialog();
if (!string.IsNullOrEmpty(od.FileName))
{
this.foto = od.FileName;
pbFoto.Load(this.foto);
}
}
catch
{
MessageBox.Show("Algum erro ocorreu! Você pode estar tentando enviar outros tipos de arquivos \n"
+ "que não são imagens, selecione arquivos do tipo .png, .jpg, .bitmap, por exemplo.", "Erro");
}
}
Product query screen:
Codetoretrievethebankimage:
try{MemoryStreamms=newMemoryStream(modelo.ProFoto);pbFoto.Image=Image.FromStream(ms);this.foto="Foto Original";
}
catch { }
Product Model Class:
public ModeloProduto(String pro_foto)
{
this.CarregaImagem(pro_foto);
}
public ModeloProduto(byte[] pro_foto)
{
this.ProFoto = pro_foto;
}
private byte[] _pro_foto;
public byte[] ProFoto
{
get { return this._pro_foto; }
set { this._pro_foto = value; }
}
public void CarregaImagem(String imgCaminho)
{
try
{
if (string.IsNullOrEmpty(imgCaminho))
return;
//fornece propriedadese métodos de instância para criar, copiar,
//excluir, mover, e abrir arquivos, e ajuda na criação de objetos FileStream
FileInfo arqImagem = new FileInfo(imgCaminho);
//Expõe um Stream ao redor de um arquivo de suporte
//síncrono e assíncrono operações de leitura e gravar.
FileStream fs = new FileStream(imgCaminho, FileMode.Open, FileAccess.Read, FileShare.Read);
//aloca memória para o vetor
this.ProFoto = new byte[Convert.ToInt32(arqImagem.Length)];
//Lê um bloco de bytes do fluxo e grava osdados em um buffer fornecido.
int iBytesRead = fs.Read(this.ProFoto, 0, Convert.ToInt32(arqImagem.Length));
fs.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}