none
memoria insuficiente C# Windows Form RRS feed

  • Pergunta

  • boa noite, estou tentando recuperar uma imagem do banco de dados e exibir no PictureBox, porém ele está dando erro de "MEMORIA INSUFICIENTE"... já tentei de tudo qualquer jeito mais não vai de forma alguma. Vou colocar o trecho de código caso alguem possa me ajudar...

    --------------------------AQUI ELE FAZ O SELECT NO BANCO COM A IMAGEM, CAPTURA BYTE ARRAY E TRANSFORMA EM STRING, PASSO ELE PRA MINHA CLASSE MODEL-------------------------------------

      public void ExibirImagem(ModelDB model)
            {
                MySqlConnection conn;
                conn = Conectar();
                string sql = "SELECT FOTO_CLIENTE FROM CLIENTES WHERE ID_CLIENTE = '" + model.Codigo + "'" ;
                MySqlCommand cmd = new MySqlCommand(sql,conn);
                byte[] imagemEmBytes = (byte[])cmd.ExecuteScalar();
              
                string strNomeArquivo = Convert.ToString(DateTime.Now.ToFileTime());
                FileStream fs = new FileStream(strNomeArquivo, FileMode.CreateNew, FileAccess.Write);
                fs.Write(imagemEmBytes, 0, Convert.ToInt32(imagemEmBytes.Length));
                fs.Flush();
                fs.Close();

                model.Teste = strNomeArquivo;            

            }

    -------- RECUPERO O ATRIBUTO COM O VALOR DO BYTE ARRAY E TENTO PASSAR ELE PRO PICTUREBOX, MAIS ELE DA ERRO DE MEMORIA INSUFICIENTE------------------------

     try
                {
                    model.Codigo = Convert.ToInt32(txtCodigo.Text);
                    dao.ExibirImagem(model);
                    pictureCliente.Image = Image.FromFile(model.Teste, true);// O ERRO ACONTECE AQUI!!
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("erro" +ex);
                }

    Caso alguem possa ajudar, agradeco!

    terça-feira, 31 de janeiro de 2017 20:39

Respostas

  • O problema (eu creio) que esteja na forma de recuperar o conteudo da imagem. 

    Voce precisa realmente salvar a imagem fisicamente para exibi-la?

    Uma opçao seria transformar o bytearray diretamente em uma imagem sem salva-la no disco.

    detse jeito:

    byte[] GetImage(ModelDB model) { using (var conn =  Conectar()) using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT FOTO_CLIENTE FROM CLIENTES WHERE ID_CLIENTE = ?idClient"; 

    cmd.Parameters.Add("?idClient", model.Codigo ); using (var reader = cmd.ExecuteReader()) { if (!reader.Read()) { return null; } const int CHUNK_SIZE = 2 * 1024; byte[] buffer = new byte[CHUNK_SIZE]; long bytesRead; long fieldOffset = 0; using (var stream = new MemoryStream()) { while ((bytesRead = reader.GetBytes(reader.GetOrdinal("FOTO_CLIENTE"), fieldOffset, buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, (int)bytesRead); fieldOffset += bytesRead; } return stream.ToArray(); } } } }


    para exibir a imagem, basta fazer:

    model.Codigo = Convert.ToInt32(txtCodigo.Text);
    byte[] image = GetImage(model);
    MemoryStream ms =new MemoryStream(image);
    pictureCliente.Image =Image.FromStream(ms);
    fonte:http://stackoverflow.com/questions/10144870/get-image-from-mysql-database-c-sharp

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------




    terça-feira, 31 de janeiro de 2017 21:09
    Moderador

Todas as Respostas

  • O problema (eu creio) que esteja na forma de recuperar o conteudo da imagem. 

    Voce precisa realmente salvar a imagem fisicamente para exibi-la?

    Uma opçao seria transformar o bytearray diretamente em uma imagem sem salva-la no disco.

    detse jeito:

    byte[] GetImage(ModelDB model) { using (var conn =  Conectar()) using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT FOTO_CLIENTE FROM CLIENTES WHERE ID_CLIENTE = ?idClient"; 

    cmd.Parameters.Add("?idClient", model.Codigo ); using (var reader = cmd.ExecuteReader()) { if (!reader.Read()) { return null; } const int CHUNK_SIZE = 2 * 1024; byte[] buffer = new byte[CHUNK_SIZE]; long bytesRead; long fieldOffset = 0; using (var stream = new MemoryStream()) { while ((bytesRead = reader.GetBytes(reader.GetOrdinal("FOTO_CLIENTE"), fieldOffset, buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, (int)bytesRead); fieldOffset += bytesRead; } return stream.ToArray(); } } } }


    para exibir a imagem, basta fazer:

    model.Codigo = Convert.ToInt32(txtCodigo.Text);
    byte[] image = GetImage(model);
    MemoryStream ms =new MemoryStream(image);
    pictureCliente.Image =Image.FromStream(ms);
    fonte:http://stackoverflow.com/questions/10144870/get-image-from-mysql-database-c-sharp

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------




    terça-feira, 31 de janeiro de 2017 21:09
    Moderador
  • Willian, obrigado por responder!

    Então, o que voce me recomendaria? Salvar a foto no banco ou salvar o caminho que ela se encontra?

    Estou desenvolvendo um software de "Médio" porte.

    Obrigado!


    terça-feira, 31 de janeiro de 2017 21:13
  • Recomendo converter o bytearray direto em imagem, como eu mostrei no post anterior.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 31 de janeiro de 2017 23:22
    Moderador