Voltando ao assunto, em SQL Server, a sintaxe é como no exemplo abaixo :
insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário', 0x71720002090000434F445F4E554D00494420437573)
onde o campo “objetos“ é do tipo IMAGE, isto é, é um blob.
O texto 0x (zero xis) no início do valor do BLOB é fixo e indica que se trata de um valor hexadecimal. Os demais valores são a representação hexadecimal de cada um dos bytes que compõem a informação que se deseja gravar. Exemplos : um byte com valor 00000000 é representado como 00, o byte 00000001 vai como 01, o byte 11111111 vai como FF, etc.
Como a limitação de tamanho desse campo é ditada pelo espaço em disco e os valores são bytes, pode-se armazenar qualquer informação com esse método : um texto XML, uma estrutura proprietária de sua aplicação, uma imagem, etc..
Essa sintaxe funciona ligeiramente diferente para Oracle e Postgre. Em Oracle, basta remover o 0x do início e colocar os dados entre apóstrofes :
insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário', '71720002090000434F445F4E554D00494420437573')
Em Postgre, é preciso decodificar a informação, chamando a função DECODE. O segundo parâmetro indica que a informação no primeiro parâmetro é um valor hexadecimal :
insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário',
DECODE ('71720002090000434F445F4E554D00494420437573','hex') )
A função em VBScript listada abaixo aceita como parâmetro um dado binário e produz como resultado a representação hexadecimal desse dado. Esse resultado pode ser usada no INSERT mas é preciso ainda considerar as diferenças de sintaxe citadas antes :
Function BinaryToHex(Binary)
Dim c1, Out, OneByte
For c1 = 1 To LenB(Binary)
OneByte = Hex(AscB(MidB(Binary, c1, 1)))
If Len(OneByte) = 1 Then
OneByte = "0" & OneByte
End If
Out = Out & OneByte
Next
BinaryToHex = Out
End Function
Dim c1, Out, OneByte
For c1 = 1 To LenB(Binary)
OneByte = Hex(AscB(MidB(Binary, c1, 1)))
If Len(OneByte) = 1 Then
OneByte = "0" & OneByte
End If
Out = Out & OneByte
Next
BinaryToHex = Out
End Function
Até a próxima ...
4 comentários :
SBO BRAZUCA - Fórum SDK SAP Business One
http://www.sbobrazuca.rg3.net
Valeu pela dica! Me ajudou muido...
ps.: Adelar
Olá Luiz,
Meus parabéns e NOSSO muito obrigado pelo seu tempo escrevendo. Tenho certeza que muitos estão lendo dicas valiosas.
Gostaria de lhe perguntar o que exatamente faz essa função DECODE a qual você citou que deve ser usada em conjunto com o PostgreSQL. Ela esta disponível no delphi ou é necessário instalar/vincular algum arquivo ?. Se não utiliza-la em que isso afetará caso deseje armazenar um arquivo .doc no campo blob ?
Ronin
A função DECODE é nativa do Postgre. Isso significa que, se você vai montar o comando SQL na mão, pode incluí-la no texto sem problemas pois ela não depende da linguagem de programação que está usando.
Mas o Delphi possui mecanismos - como o ADO - que te permitem montar o comando SQL num nível mais alto de forma que você não precise se preocupar com diferenças de sintaxe entre tipos diferente de bancos de dados.
Há no blog um post com mais detalhes sobre isso : Trabalhando com BLOBs em Delphi e C++ Builder.
Postar um comentário
OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.
Observação: somente um membro deste blog pode postar um comentário.