PROBLEMA AO INSERIR IMAGEM NO BD

 Tópico anterior Próximo tópico Novo tópico

PROBLEMA AO INSERIR IMAGEM NO BD

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#489799 - 05/08/2019 15:54:33

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


Boa tarde pessoal,
Montei uma função genérica pra abastecer tanto o form como o objeto pra inserir dados no bd mysql
todos estão funcionando bem, mas ao inserir imagens está dando problema  e não erro(msg),
são inseridos dados mas os mesmos são incompletos, pois não retornam imagem depois,
essa é a parte generica pra trabalhar com imagem:
  ElseIf TypeOf Campo Is System.Windows.Forms.PictureBox Then
                    If Campo.TAG <> "" Then
                        For Each prop In tipo.GetProperties()
                            If UCase(prop.Name.ToUpper) = UCase(Campo.tag) Then
                                NmeCpo = prop.Name
                                If Not (Campo.Image Is Nothing) Then
                                    Dim img As Bitmap
                                    img = Campo.Image

                                    Dim filename As String = Path.GetTempPath & "img1.jpg"
                                    File.Delete(filename)
                                    img.Save(filename)
                                    Dim caminho As String = filename
                                    Dim mystream As FileStream = New FileStream(caminho, FileMode.Open, FileAccess.Read)
                                    Dim myimagebuffer(mystream.Length) As Byte
                                    mystream.Read(myimagebuffer, 0, Convert.ToInt32(mystream.Length))
                                    mystream.Close()
                                    prop.SetValue(Obj, myimagebuffer)

                                Else
                                    prop.SetValue(Obj, Nothing)
                                End If
                            End If
                        Next
                    End If
                End If

o campo no mysql é MEDIUMBLOB
a variavel do objeto é byte()
diferente de byte
Quando uso esse código de conversão e jogo direto na variavel da classe, Salva normalmente mas,
ao usar essa forma genérica, os dados são reduzidos, não mostrando uma imagem depois



O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


Resposta escolhida #489801 - 05/08/2019 18:22:14

FABRICIOWEB
BELO HORIZONTE
Cadast. em:Novembro/2011


em c# faço assim para salvar no banco

byte[] image_byte = null;

  FileStream fstream = new FileStream(localimagem, FileMode.Open, FileAccess.Read);
  BinaryReader br = new BinaryReader(fstream);
  image_byte = br.ReadBytes((int)fstream.Length);



#489816 - 06/08/2019 16:01:43

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


FABRICIOWEB, desculpe a demora em responder, correira tremenda,
Descobri que o erro não está na parte do código que postei, mas sim em outra parte, quando crio os parâmetros
Ao transferir os valores para os parâmetros, ao passar pelo tipo Byte() o mesmo é convertido em string, e é aí que está o erro:
   Public Sub CriaParametros(ByVal Obj As Object, ByRef Para As String(), ByRef Valor As String())
        Try

            Dim Tipo = Obj.[GetType]()
            Dim propriedades_info = Tipo.GetProperties()
            Dim CT As Integer = propriedades_info.Count
            Dim parametro(CT) As String
            Dim valores(CT) As String
            Dim a As Integer = 0
            For Each c In propriedades_info
                With propriedades_info(a)

                    If .GetIndexParameters().Length = 0 Then
                        Dim propriedade_valor
                        propriedade_valor = .GetValue(Obj, Nothing)

                        If IsDate(propriedade_valor) Then
                            If propriedade_valor > "01/01/0001" Then
                                If Format(propriedade_valor, "HH:mm") > "00:00" Then
                                    valores(a) = Format(propriedade_valor, "yyyy-MM-dd HH:mm")
                                Else
                                    valores(a) = Format(propriedade_valor, "yyyy-MM-dd")
                                End If

                            Else
                                valores(a) = String.Empty
                            End If
                        ElseIf IsNumeric(propriedade_valor) Then
                            If propriedade_valor Is Nothing Or propriedade_valor = 0 Then
                                valores(a) = ""
                            Else
                                valores(a) = propriedade_valor
                            End If
                        Else
                           If propriedade_valor Is Nothing Then
                                valores(a) = String.Empty
                            Else
                                valores(a) = propriedade_valor.ToString
                            End If

                        End If
                        parametro(a) = "@" & c.Name
                    End If
                End With
                a += 1
            Next
            Para = parametro
            Valor = valores
        Catch __unusedException1__ As Exception
            Throw
        End Try
    End Sub


Então, não sei como fazer o tratamento dos dados, já que não existe o PropertyType Byte()


O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#489817 - 06/08/2019 16:06:34

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


É na parte em negrito do código que está o erro.
Se colocar:
valores(a) = propriedade_valor
dá o erro: A conversão do tipo 'Byte()' no tipo 'String' não é válida

se colocar: valores(a).propriedade_valor.ToString
não dá erro, salva mas não é imagem

O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#489821 - 06/08/2019 17:24:20

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe

Última edição em 06/08/2019 17:26:34 por FOXMAN

Então.
o System.Byte[], existe no contexto , precisa saber se propriedade valor é do tipo System.Byte[] para setar da forma que está fazendo.
Se não for, deverá fazer um cast convertendo propriedade_valor para Byte[].

Algo como :
dim s as byte[] = Encoding.ASCII.GetBytes(propriedade_valor.ToString())
valores(a) = s


ou se tiver certeza que valores(a) é um system.Byte(), pode fazer direto.
valores(a) = Encoding.ASCII.GetBytes(propriedade_valor.ToString())






Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#489837 - 07/08/2019 11:28:52

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


Tou na correria hoje, faxina no setor rsrsrsrsrs, mas vou testar depois!!
Mas valores(a) é string, acho que é aí que está o problema  

O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#489839 - 07/08/2019 11:40:27

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


o formato da variável valores(a) é string, mas como é uma função genérica, nem sempre os dados serão byte()
não consigo declarar valores(a) como variant em vb.net
a declaração tem que ser assim
public sub MontaParametro(byval obj as object, byref Valores() as string, byref parametros() as string)

end sub

O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#489873 - 08/08/2019 18:13:48

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Eu salvo as imagens assim

                        Dim Img As New MemoryStream
                        Pic1.Image.Save(Img, Pic1.Image.RawFormat)
                        Dim ArrImage() As Byte = Img.GetBuffer
                        RstCmd.Parameters.Add("@Logo", SqlDbType.Image).Value = ArrImage

No meu caso é sql server
Mas o que importa é que ArrImage é o array de bytes contendo a imagem...
Só salvar ele

Pra ler a imagem eu procedo assim:
                            If Not IsDBNull(Rst!Logo) Then
                                Dim Img As New MemoryStream(CType(Rst!Logo, Byte()))
                                Pic1.Image = Image.FromStream(Img)
                            Else
                                Pic1.Image = Nothing
                            End If

Rst!Logo é o campo retornado pelo DataReader no Banco de Dados



#489884 - 09/08/2019 08:18:45

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


PKUGSOFTSM, o problema é que estou montado classes genericas pra montar e abastecer os parametros, e como as variáveis criadas são do tipo string, estou tendo problemas de passar esses valores byte() para string.
Pelo que vejo, vou ter que criar uma variavel byte generica, testar os tipos de dados, se forem bytes, preencho a variavel byte(), vou pensar numa maneira de concatenar as ideias com o código.
por enquanto, vou deixar parado o post e deixar pra ver se alguem mais me dá uma ideia de como fazer isso rsrsrs
Quando chegar no resultado, posto a solução aqui.


O conhecimento é como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#489896 - 09/08/2019 13:19:40

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


'Pra converter  
Dim BytoTostr As String = System.Text.ASCIIEncoding.ASCII.GetString(arrayBayte())

'Pra retornar pra byte
Dim ArrayByte as Byte() = System.Text.Encoding.Unicode.GetBytes(ByteToStr)

Obs: Verifica se não ocorre nenhuma distorção de valores nessa conversão



#489900 - 09/08/2019 14:26:37

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
PKUGSOFTSM, o problema é que estou montado classes genericas pra montar e abastecer os parametros, e como as variáveis criadas são do tipo string, estou tendo problemas de passar esses valores byte() para string.
Pelo que vejo, vou ter que criar uma variavel byte generica, testar os tipos de dados, se forem bytes, preencho a variavel byte(), vou pensar numa maneira de concatenar as ideias com o código.
por enquanto, vou deixar parado o post e deixar pra ver se alguem mais me dá uma ideia de como fazer isso rsrsrs
Quando chegar no resultado, posto a solução aqui.


Eu também tenho classes genéricas, no entanto ao setar o valor da variável da classe genérica, eu primeiro verifico o tipo de dados que será informado, e retorno o valor no tipo de dados desejado.
Seria algo como :

Util.ConverteValor(obj.GetType().GetProperty(prop.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetField).PropertyType, dr[prop.Name].ToString());
prop.SetValue(obj, Controle.Acao.ValorParametro, null);
                                

Onde ConverteValor, recebe dois parametros :
O tipo de dados(PropertyType), e o valor que será atribuido(string).

Então em prop.SetValue(obj, Controle.Acao.ValorParametro), eu tenho o tipo de dados desejado, para a propriedade.
Ressalto que ao gerar a Classe, para não ter problemas, com tipos de dados diferente entre Classe e Tabela, eu tenho um script no banco de dados que gera a classe. Depois apenas faço alguns ajustes....

Lógico , que trata-se de situações diferentes.
No meu banco de dados, tenho os campos bem definido, assim como nas classes.

O grande vilão de classes genéricas é no meu ponto de vista, justamente o tipo de dados em relação ao campo na tabela.




Grupo DotNet.Br no FaceBook

Grupo WhatsDev



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por DAMASCENO.CESAR em 13/08/2019 10:33:08