[RESOLVIDO] IMAGEM NO BANCO MYSQL

ESLEYSANCHES 18/11/2010 17:07:04
#357788
Olá a todos. Estou fazendo em C#, mas pode ser em VB.Net tbm.

Não estou conseguindo armazenar imagem no banco de dados MySQL, já tentei armazenar em formato VARCHAR (Stream do JPG) ja tentei com BLOB nos bytes da imagem mas na hora que vou ver no banco de dados ele envia apenas o primeiro byte. Já pesquisei no Google, MSDN e não consegui galera, to ficando maluco e tenho somente esse final de semana para concluir isso. kkkkkkkkkkkkk Vida de programador.
Já tentei até a usar uma agenda aqui em .NET com MySQL mas não consegui.

Abaixo estou usando esse código em C#:


// Variaveis da conexão, Command e DataReader
MySqlConnection CONEXAO = new MySqlConnection();
MySqlCommand COMANDO = new MySqlCommand();
MySqlDataReader DR;

// Esse é o evento click para salvar a imagem no BD MySQL
System.IO.FileStream fs = new System.IO.FileStream([Ô]C:\    ema.jpg[Ô], System.IO.FileMode.Open);
Byte[] ARQUIVO = new Byte[fs.Length];
fs.Read(ARQUIVO, 0, Convert.ToInt32(fs.Length));
fs.Close();
COMANDO.CommandText = ([Ô]UPDATE tbl_agenda SET imagem=[ô]?[ô] WHERE id=257[Ô]);
COMANDO.Parameters.Add([Ô]@imagem[Ô], MySqlDbType.Blob, ARQUIVO.Length).Value = ARQUIVO;
COMANDO.ExecuteNonQuery();


Desde já grato galera !!
Abraços !!!
JONATHANSTECKER 18/11/2010 17:23:31
#357789
Dá uma olhada neste exemplo.
Storing Images in MySQL using ASP.NET
ESLEYSANCHES 18/11/2010 20:52:03
#357795
Obrigado pelo ajuda amigo, testei varias vezes mais cada hora acontece um erro diferente, to ficando de cabeça quente com essa .
Não tenho nem ideia mais como posso add isso.
ESLEYSANCHES 19/11/2010 01:09:08
#357804
Voltei galera e com otimas noticias. rsrs

Tudo deu certo e já vou avisar que não é como o povo diz não muitas informações contraditórias, muitos explicam resolvi começar do zero, baixei ate um editor Hexadecimal para comparar o arquivo fisico real e os bytes gravados no banco. Dai descobri que a quantidade de bytes gravadas é igual ao do arquivo, porém o conteudo dele não. E posso dizer com certeza que eu não confio nem f.... no metodo [txt-color=#e80000]System.Text.Encoding.ASCII.GetBytes(Sua_String_aqui);[/txt-color] Pois alguns caracters não funcionam legal alguns são trocados, como são binários não sei exatamente oq é trocado mas que ele troca é certeza. Graças a o HackMan (Editor Hexadecimal).
Ok, resolvi então achar uma forma diferente de abrir a imagem e pegar o array de Bytes dela.
Acreditem se quiser nem o StreamReader, nem o FileStream funcionaram, e para descobrir isso ? Quase tive uma crise. Meu mouse coitado, sofreu. rsrsrs
Depois de tudo isso ainda descobri que o campo BLOB não é 100% ideal pois ele tem uma limitação de bytes, descobri que meu caso é o campo [Ô]LONGBLOB[Ô] ou até o [Ô]MEDIUMBLOB[Ô] Para não ter problemas. rsrs

[txt-color=#0000f0]Informações sobre o tamanho dos tipos BLOB[/txt-color]
BLOB, TEXT
L+2 bytes, onde L < 2^16
MEDIUMBLOB, MEDIUMTEXT
L+3 bytes, onde L < 2^24
LONGBLOB, LONGTEXT
L+4 bytes, onde L < 2^32
[txt-size=5]fonte: http://dev.mysql.com/doc/refman/4.1/pt/blob.html[/txt-size]

Depois descobri que tudo simplesmente se baseia no System.IO.MemoryStream() ... é mole ?? rsrs
Ai vcs se perguntam como ?? Sendo que o Memory Stream não carrega arquivos. Bem como no meu caso é imagem criei uma variavel Image, carreguei os dados a partir do JPG, depois salvei da variavel Image para dentro do StreamMemory.
Apos isso ... Criei a variavel array teste. define o teste como os dados do MemoryStream Somente depois resolvi gravar no banco de dados.

Hãããã ... para os navegantes do .NET (VB ou C#) cuidado que tem um filhu da mãe em foruns por ai dizendo que para gravar no banco MySQL com parameters é assim:

MySqlCommand comm = new MySqlCommand([Ô]UPDATE tbl_teste SET imagem=@imagem WHERE id=1[Ô], CONEXAO);
comm.Parameters.Add(?imagem[Ô], MySqlDbType.VarChar).Value = Seu_TXT.text;
;

Pois é para quem usa ODBC realmente é isso ae, mais para os amigos atualizados que gostam de usar a Classe .NET do MySQL fica diferente (quase igual), a diferença é que ao inves de usar o arroba (@) se utiliza o interrogação (?), e deve-se add o MySQLParameter

MySqlCommand comm = new MySqlCommand([Ô]UPDATE tbl_teste SET imagem=?imagem WHERE id=1[Ô], CONEXAO);
comm.Parameters.Add(new MySqlParameter([Ô]?imagem[Ô], MySqlDbType.VarChar, 45)).Value = [Ô]Teste[Ô];

Ok, depois de todo esse trampo quase me esqueci ... Tenho que pegar depois a imagem do banco de dados !!!!!!


Ai de novo ... Mais uma crise e quase um mouse novo. kkkkkkkkkkkkkk
Tenho que criar um array de byte e definir o tamanho dos bytes igual aos que estão gravados no banco de dados (Sem mentira nenhuma fiquei 1 hora somente nessa merda dessa linha)
Depois puxei os bytes da coluna, e para descobrir que existe um metodo no DataReader semi-pronto. rsrs
Usei o [txt-color=#e80000]DataReader.GetBytes[/txt-color] os parametros dele é que vc tem que dizer qual é a coluna que está o campo BLOB (não pode ser pelo nome da coluna e sim pelo numero INT dela, se existir pelo nome, me avisem, pq atraves de INT é f...), o tamanho inicial (0), para qual array de byte vai, e o tamanho total a puxar.

Depois disso, fechei o DataReader criei um MemoryStream dos bytes que eu peguei do BD.
Criei uma variavel Image pedi para carregar de um stream e apontei o memoryStream. Parece que não, mas foi muiiitooo desgastante galera, realmente. Sem contar a falta de material que encontrei na NET, os poucos que eu encontrei o pessoal explica até um certo ponto depois quando dá erro o cara posta de novo dizendo que não deu certo. E cade o sujeito para responder ?? O cara some.
Quase todos estão assim.
O povo quer receitinha de bolo, e muitos nem sabem qual a diferença entre um byte e um int. Acreditem, vi essa pergunta no forum; Vi até nego tentando armazenar string em um Double. kkkkkkkkkkkkkkkkkkk

Bom galera o código completo segue abaixo, espero que ajude alguém. Se precisarem, pode me chamar.

// Variaveis que utilizei para se conectar ao MySQL
MySqlConnection CONEXAO = new MySqlConnection();
MySqlCommand COMANDO = new MySqlCommand();
MySqlDataReader DR;

// Conexão com o BD MySQL
CONEXAO.ConnectionString = ([Ô]Server=127.0.0.1;Database=db_teste;User=root;Password=root;[Ô]);
COMANDO.Connection = CONEXAO;
CONEXAO.Open();

//-------------------------------------------------------------------------------------
// Gravar imagem no BD
//-------------------------------------------------------------------------------------
pictureBox1.Image = Image.FromFile([Ô]C:\    ema.jpg[Ô]);
Application.DoEvents();

System.IO.MemoryStream MS = new System.IO.MemoryStream();
pictureBox1.Image.Save(MS, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] file = new byte[MS.Length];
file = MS.ToArray();
pictureBox1.Image = null;

COMANDO.Commandtext = ([Ô]UPDATE tbl_teste SET imagem=?imagem WHERE id=1[Ô], CONEXAO);
COMANDO.Parameters.Add(new MySqlParameter([Ô]?imagem[Ô], MySqlDbType.LongBlob, file.Length)).Value = file;
COMANDO.ExecuteNonQuery();

// Liguem não pela msg tava muito p da vida. rsrs
MessageBox.Show([Ô]Finalmente essa merda dessa imagem foi salva (aparentemente) e chegou até aqui !![Ô]);


//-------------------------------------------------------------------------------------
// Recupera a imagem no BD
//-------------------------------------------------------------------------------------
COMANDO.CommandText = ([Ô]SELECT * FROM tbl_teste WHERE id=1[Ô]);
DR = COMANDO.ExecuteReader();
DR.Read();
Byte[] teste = new Byte[DR.GetBytes(2,0,null,0,int.MaxValue)];
DR.GetBytes(2, 0, teste, 0, teste.Length);
DR.Close();

System.IO.MemoryStream MS = new System.IO.MemoryStream(teste, 0, teste.Length);
pictureBox1.Image = Image.FromStream(MS);

// Liguem não pela msg ... Aqui ainda tava muito p da vida tbm. rsrs
MessageBox.Show([Ô]NOSSAA! Vai chover PEN-DRIVE se vc conseguir ver essa msg e a imagem no pictureBox[Ô]);



Qualuqer coisa quem tiver duvida pode me gritar
Abraços galera !!!
Tópico encerrado , respostas não são mais permitidas