Jump to content

[ACCESS] System.Byte[]' to type 'System.Drawing.Image


raffaellramos
 Share

Recommended Posts

Pessoal mals ae mas com eu crio um post??

desculpe a ignorância :wallbash:

é que o TCC ta me Fritando minha cabeça

Estou com certos problemas no meu Trabalho de Conclusão de Curso

minha previa da apresentação é na semana que vem e isto já deveria estar pronto

estou utilizando um banco de dados do Access  Países.accdb

nele contém várias informações e um objeto de imagem e também um

arquivo txt anexo que só aparece o nome no VB

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim conexao As OleDbConnection
        conexao = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Países.accdb")
        conexao.Open()

        Dim sql As String = ""
sql = "Select bandeira, historico from Síntese where codpais = " + CStr(Codigo)

Dim ct As New OleDbCommand
        ct.Connection = conexao
        ct.CommandText = sql

        Dim du As OleDbDataReader = ct.ExecuteReader
        If du.Read Then

imagebandeira.image = du(image)

End If
    
        du.Close()
        conexao.Close()

    End Sub

dá esse erro

System.Byte[]' to type 'System.Drawing.Image

por favor ajudem!!

Link to comment
Share on other sites

Bom Dia, raffaellramos

Se estiver apenas a guardar o directório da imagem na base de dados tipo 'C:\imagem.jpg'

em vez de

imagebandeira.image = du(image)

tente por

Dim image As String = du.Item("bandeira")
Me.PictureBox1.Image = New System.Drawing.Bitmap(image)

A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Link to comment
Share on other sites

tente por

Dim image As String = du.Item("bandeira")
Me.PictureBox1.Image = New System.Drawing.Bitmap(image)

Bom Dia André

Valeu por responder

realmente só está o diretório das imagens

no banco de dados

testei esse código

parece ter eliminado o primeiro erro

mas dá um erro de conversão

não é valida converter Byte para String

{"Conversion from type 'Byte()' to type 'String' is not valid."}

Valeu!!

Link to comment
Share on other sites

então Andre

o caminho está em byte

e agora dá erro de parametro

{"Parameter is not valid."}

no código

Me.imagebandeira.Image = New System.Drawing.Bitmap(image)

se eu colocar byte no lugar de string

dá esse erro

{"Conversion from string "System.Byte[]" to type 'Byte' is not valid."}

e se deixar byte e tirar o tostring dá esse erro

{"Conversion from type 'Byte()' to type 'Byte' is not valid."}

Link to comment
Share on other sites

Para converter um ficheiro para Bytes

  Dim FS As New IO.FileStream(Origem, IO.FileMode.Open, IO.FileAccess.Read)
  Dim Bytes(FS.Length() - 1) As Byte
  FS.Read(Bytes, 0, Bytes.Length)

Depois na Base de Dados guardas Array "Bytes"

Para Ler

Dim Bytes() As Byte
Bytes = Origem
Dim FS As New IO.FileStream(Destino, IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(Bytes, 0, Bytes.Length)

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

valeu André

valeu Caça

Não entendo muito de banco de dados

então to meio que Boiando aqui  :wallbash:

não entendi esse código direito

no caso "Origem" se refere ao banco, ao picturebox ou outra coisa??

Para converter um ficheiro para Bytes

  Dim FS As New IO.FileStream(Origem, IO.FileMode.Open, IO.FileAccess.Read)
  Dim Bytes(FS.Length() - 1) As Byte
  FS.Read(Bytes, 0, Bytes.Length)

Depois na Base de Dados guardas Array "Bytes"

Para Ler

Dim Bytes() As Byte
Bytes = Origem
Dim FS As New IO.FileStream(Destino, IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(Bytes, 0, Bytes.Length)

o projeto do meu grupo fugiu muito do que

nós aprendemos no curso

lá trabalhamos com SqlServer

e ainda bem simples

por exemplo Cadastro de Clientes, vendedor, estoque

essas coisas

o nosso projeto é sobre geografia

tem o mapa mundi feito em flash

e um combobox no form 1

a partir da opção do pais selecionada

chamamos o form 2 nele contém as infomações do BD

nele tem os tabs Sintese, rede e outros

no sintese carrega as informações gerais

localização, capital , moeda idioma entre outros

e se a pessoa clicar em outro tab vai aparecer as informações referentes a ele

também no sintese tem a opção ver no google maps onde abre o form3

com o componente web com o link do google maps

também queremos colocar os hinos dos 193 paises

e os históricos deles

mas não sei se vamos ter tempo suficiente pra isso

bom falando do BD

o banco de dados tem 193 cadastros em cada coluna

temos 6 tabelas e varia o numero de colunas

de 4 até 11

Link to comment
Share on other sites

Eae Caça Beleza?

não estou conseguindo :wallbash:

no caso ficaria assim??

Dim Bytes() As Byte

            Bytes = "C:\\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Países.accdb"

            Dim FS As New IO.FileStream(du("bandeira"), IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            PictureBox.Image = du("image")

Link to comment
Share on other sites

Eae Caça Beleza?

não estou conseguindo :wallbash:

no caso ficaria assim??

Dim Bytes() As Byte

            Bytes = "C:\\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Países.accdb"

            Dim FS As New IO.FileStream(du("bandeira"), IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            PictureBox.Image = du("image")

Dim Bytes() As Byte

            Bytes = "C:\\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Países.accdb"

            Dim FS As New IO.FileStream(du("bandeira"), IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            PictureBox.Image = du("bandeira")

Link to comment
Share on other sites

O que tens que por é tipo isto:

Dim Bytes() As Byte
Bytes = du("bandeira")
Dim FS As New IO.FileStream("C:\a.jpg", IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(Bytes, 0, Bytes.Length)
FS.Close()
PictureBox.Image = "C:\a.jpg"

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

fala Caça

num estou conseguindo tentei algumas coisas mas não foi

Dim Bytes() As Byte

            Bytes = du("bandeira")

            Dim endereço As String

            endereço = "C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC\" + Bytes.ToString

            Dim FS As New IO.FileStream(endereço, IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            FS.Close()

       

            picturebox.Image = New System.Drawing.Bitmap(endereço)

nesse deu erro no parametro

imagebandeira.Image = New System.Drawing.Bitmap(endereço)

esse também

Dim Bytes() As Byte

            Bytes = du("bandeira")

            ' minhas imagens são do tipo gif

            Dim FS As New IO.FileStream("C:\a.gif", IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            FS.Close()

       

          Picturebox.Image = "C:\a.gif"

erro: Valor do tipo String não pode ser convertido pro tipo System.Drawing.Image

picturebox.Image = "C:\a.gif"

e esse também

Dim Bytes() As Byte

            Bytes = du("bandeira")

            Dim FS As New IO.FileStream("C:\a.gif", IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            FS.Close()

       

            imagebandeira.Image = New System.Drawing.Bitmap("C:\a.gif")

erro: Parametro inválido

  imagebandeira.Image = New System.Drawing.Bitmap("C:\a.gif")

tentei colocar também no lugar de System.Drawing.Bitmap

System.Drawing.Image

mas deu erro dizendo que new não pode ser usado

na classe a qual é declarada 'MustInherit'

mas se tirar o new diz que não posso usar Drawing e Image na mesma Expressão

Link to comment
Share on other sites

Experimenta isto (não testei):

Dim Bytes() As Byte
Bytes = du("bandeira")
' minhas imagens são do tipo gif
Dim FS As New IO.FileStream("C:\a.gif", IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(Bytes, 0, Bytes.Length)
FS.Close()

Picturebox.ImageLocation = "C:\a.gif"

A diferença é que passas a usar o ImageLocation (http://msdn.microsoft.com/en-us/library/system.windows.forms.picturebox.imagelocation.aspx) em vez do Image (http://msdn.microsoft.com/en-us/library/system.windows.forms.picturebox.image.aspx)

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

eae Rechousa Beleza?

então meio que deu certo

mas também não deu

o form agora pelo menos abre

só que aparece o bitmap de erro

ao invés da bandeira

código:

Dim Bytes() As Byte

            Bytes = du("bandeira")

            Dim endereço As String

            endereço = "C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC" + Bytes.ToString

            Dim FS As New IO.FileStream(endereço, IO.FileMode.Create, IO.FileAccess.Write)

            FS.Write(Bytes, 0, Bytes.Length)

            FS.Close()

            imagebandeira.ImageLocation = endereço

Link to comment
Share on other sites

Olá,

Não me parece que seja bem assim. Estás a misturar alhos com bugalhos  😁

endereço = "C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC" + Bytes.ToString

Repara que estás a concatenar um caminho com Bytes? Isto não faz sentido. Se colocares um breakpoint nessa linha e veres o resultado da tua variável endereço, vais ver que não é o que pretendes.

A solução que apresento abaixo vai buscar a imagem à base de dados e grava-a numa pasta, contudo o nome da imagem vai ser o ID da Bandeira + ".gif" (exemplo: C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC\1.gif)

Muito possivelmente tens um campo da tua tabela que é corresponde ao ID (id, idPais, ou qq coisa do género). Vamos imaginar que se chama idPais. Se não for, é fácil adaptares.

Sugestão:

- Não uses variáveis com caracteres portugueses. Substitui o nome da variável endereço por endereco;

- Recomendo também que utilizes a class System.IO.Path para concatenar o caminho da tua pasta onde vão ficar as imagens e os ficheiros com o nome das imagens.

Dim caminho As String
Dim idPais As Integer
Dim Bytes() As Byte
Dim endereco As String

caminho = "C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC"
idPais = du("idPais")
Bytes = du("bandeira")

endereco = System.IO.Path.Combine(caminho, idPais + ".gif")
' Nota: Embora esteja a sugerir a versão acima (por ser mais fácil para perceberes), costumo usar o String.Format para concatenar o nome do ficheiro
' endereco = System.IO.Path.Combine(caminho, String.Format("{0}.gif", idPais))

Dim FS As New IO.FileStream(endereco, IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(Bytes, 0, Bytes.Length)
FS.Close()

Experimenta assim (atenção que não testei o código e não domino VB.Net - comigo é só C#  ?)

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

Eae Pessoal Blza?

Valeu Caça, Rechousa e AndrePereira!

Vocês me ajudaram muito

As coisas não sairam como esperava

mas no fim deu tudo certo

Rechousa o código que você mandou

me Abriu os olhos eu entendi bem

não deu certo, mas eu compreendi a lógica

bom e logo caiu a fixa

se eu tenho uma pasta com todas as imagens

e no banco está o caminho delas,

porque eu tenho que direciona-lo pelo banco de dados?

então pensei em fazer isso diretamente

usando o seguinte código?

imagebandeira.ImageLocation = "C:\Documents and Settings\admin\Meus documentos\TCC - Betas\Banco de Dados - Suíte Geográfica\Bandeiras - TCC\" + lblnomepais.Text + ".gif"

os nomes das bandeiras estão exatamente iguais aos que estão no banco de dados

Bom pessoal por enquanto está resolvido

é Realmente uma pena não ter conseguido

fazer pela Base de Dados

Quando eu tiver mais tempo livre

vou tentar novamente

Obrigado!!

Caça, Rechousa e AndrePereira!! 😉

Vocês Contribuíram em muito no meu projeto

sem contar que ampliei um pouco meus conhecimentos

em programação

Vlw!!

Até a próxima  :smoke: ?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.