Salvar arquivo .RTF no banco

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Rafael_Rodrigo
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 12 Mar 2012 17:47
Localização: Blumenau/SC

Salvar arquivo .RTF no banco

Mensagem por Rafael_Rodrigo »

Bom dia a todos. Preciso salvar um arquivo .RTF no banco de dados SQL, para isto criei uma coluna do tipo VARBINARY(MAX) que irá armazenar o arquivo. O problema é que não estou conseguindo converter o arquivo para binário(sem converter não posso salvá-lo). Atualmente a rotina lê linha por linha do arquivo RTF concatena tudo numa STRING e joga para o banco. Sou novo em programação Clipper e não sei nem se isso será possível. Procurei aqui no fórum algum tópico parecido mas nada encontrei.

desde já agradesço a ajuda de todos,

Rafael Rodrigo.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Salvar arquivo .RTF no banco

Mensagem por alxsts »

Olá!

Você não informa qual é o banco. Também não está claro onde entra a programação Clipper neste caso.

Independentemente do banco, creio que a melhor saída, neste caso, seja salvar como caracter. Troque VARBINARY por VARCHAR.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Rafael_Rodrigo
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 12 Mar 2012 17:47
Localização: Blumenau/SC

Salvar arquivo .RTF no banco

Mensagem por Rafael_Rodrigo »

Olá, o banco de dados é SQL SERVER 2008 R2, eu citei somente "SQL" acima hehe ..quanto a programação em clipper ?? citei acima que minha rotina salva no banco(campo "text" no banco, "varchar" é praticamente a mesma coisa pois posso definir como "varchar(max)") uma string contendo o arquivo lido linha por linha e que agora preciso gravar no banco não esta string mas sim o arquivo .RTF em si, ou seja tenho que converter este arquivo para binário para posteriormente salvá-lo, portanto para salvar em binário preciso definir uma coluna como "varbinary". Minha dificuldade está em escrever o código que vai 'pegar' os bytes do arquivo .RTF

att,

Rafael Rodrigo.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Salvar arquivo .RTF no banco

Mensagem por alxsts »

Olá!

Eu salvo conteúdo de arquivos desse tipo como varchar em SQL SERVER 2008 R2. Tente algo do tipo

Código: Selecionar todos

cSQL := "INSERT tabela (texto) VALUES '" + MemoRead( "Arquivo.RTF" ) + "'"
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Rafael_Rodrigo
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 12 Mar 2012 17:47
Localização: Blumenau/SC

Salvar arquivo .RTF no banco

Mensagem por Rafael_Rodrigo »

Oi novamente, pois é eu também fazia desta maneira .. a função MemoRead(string) vai retornar o conteúdo do arquivo, é a mesma coisa que eu ler linha por linha do arquivo e depois salvar. Mas o problema é que o arquivo .RTF que eu tenho que salvar tem cerca de 3 milhões de caracteres ai fica dificil hehe .. por este motivo estava pensando em salvar o arquivo como binário. De qualquer maneira agradesço a ajuda.

att,

Rafael Rodrigo.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar arquivo .RTF no banco

Mensagem por Pablo César »

o problema é que o arquivo .RTF que eu tenho que salvar tem cerca de 3 milhões de caracteres
Uma ideia: pegue esse conteúdo e aplique alguma função de compressão. Acredito que o hash MD5 pode vir a servir. Principalmente se existem espaços ou caracteres muito repetidos...

Pesquise algo do tipo: sqlite3_bind_text( pStmt, 3, hb_md5(enum:__enumKey) ) que tem como exemplo no C:\MiniGUI\SAMPLES\Advanced\SQLITE\authorizer.prg
eu citei somente "SQL" acima hehe ..quanto a programação em clipper ??
É ou não é para Clipper ? Ou está migrando de Clipper para... ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Rafael_Rodrigo
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 12 Mar 2012 17:47
Localização: Blumenau/SC

Salvar arquivo .RTF no banco

Mensagem por Rafael_Rodrigo »

Bom dia, estou pesquisando como utilizar o hash MD5 que o colega Pablo indicou.. a aplicação é para Clipper, apesar de estarmos migrando o sistema para JAVA.
Mesmo se a idéia de utilizar hash MD5 for válida para o meu caso, será que é possivel salvar um arquivo no banco de dados em uma aplicação Clipper ??

Ja tentei desta maneira:

1 - Passando o arquivo como parâmetro.

Código: Selecionar todos

pFile := FOpen2(cPath + "\temp\$confctr.Rtf", FO_READ)
oStmt:= SQLStatement{ "UPDATE TS1_COTR SET COTR1_FILE = (?) WHERE COTR1_COD = " + NTrim(nCotr1_Cod), oConn }
oStmt:Execute(pFile)
2 - Passando o local em disco do arquivo como parâmetro.

Código: Selecionar todos

oStmt:= SQLStatement{ "UPDATE TS1_COTR SET COTR1_FILE = (?) WHERE COTR1_COD = " + NTrim(nCotr1_Cod), oConn }
oStmt:Execute(cPath + "\temp\$confctr.Rtf")
Neste segundo caso, ele irá salvar somente o caminho do arquivo hehe, claro. E no primeiro, ao meu ver deveria salvar o arquivo como binário.

att,

Rafael Rodrigo.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Salvar arquivo .RTF no banco

Mensagem por ANDRIL »

Rafael_Rodrigo escreveu:utilizar hash MD5
Amigo, MD5 cria uma assinatura, no seu caso do arquivo, mais não é compactação. Voce não irá "compactar" um arquivo gerando por exemplo um MD5 (A1B2C52D15G55111S52E2S5) e depois recuperar isso como o arquivo original.
pFile := FOpen2(cPath + "\temp\$confctr.Rtf", FO_READ)
oStmt:= SQLStatement{ "UPDATE TS1_COTR SET COTR1_FILE = (?) WHERE COTR1_COD = " + NTrim(nCotr1_Cod), oConn }
oStmt:Execute(pFile)
Isso não é Clipper, não seria x[H]arbour ou Java? Com Clipper puro, não vai conseguir conexão com seu banco de dados usando SQL.
Rafael_Rodrigo escreveu:será que é possivel salvar um arquivo no banco de dados em uma aplicação Clipper
O Clipper usa padrão DBF, que pode conter um campo memo, o limite deste campo é 64k, apenas.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Rafael_Rodrigo
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 12 Mar 2012 17:47
Localização: Blumenau/SC

Salvar arquivo .RTF no banco

Mensagem por Rafael_Rodrigo »

Boa tarde. Pois é Andril, descobri a pouco que não tenho como recuperar os dados originais com hash MD5 T_T ..
ANDRIL escreveu:Isso não é Clipper, não seria x[H]arbour ou Java? Com Clipper puro, não vai conseguir conexão com seu banco de dados usando SQL.
Para o Clipper foram desenvolvidos RDDs que permitem o uso de SGBD, como o ADS Advantage Database Server, o RaSQL/b para Btrieve/Pervasive e o UltiRoute, que possibilita o acesso a qualquer SGBD via ODBC. Aqui mesmo no fórum tem um pequeno exemplo Conectar Clipper con sql

Alguém saberia responder se é possível salvar no banco de dados um arquivo .RTF ou alguma outra extensão qualquer?

att,

Rafael Rodrigo.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar arquivo .RTF no banco

Mensagem por Pablo César »

Quer outro conselho ? Eu apenas guardaria o nome de cada arquivo e armazenaria esses arquivos RTF em pasta separadas, até poderia sub-dividir a pasta caso houvera muita quantidade de arquivos. Então os agruparia de 100 em 100. Incorporar esses arquivo no BD, na minha opinião: é desnecessário. Mas ainda tratando-se de Clipper...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar arquivo .RTF no banco

Mensagem por Pablo César »

Alguém saberia responder se é possível salvar no banco de dados um arquivo .RTF ou alguma outra extensão qualquer?
Não como seria em SQL, mas tratando de Clipper e DBF. A sugestão que dei de compactar para que ocupe o menor espaço possível dentro de campo MEMO, apesar que detesto e não utilizo de jeito nenhum campo MEMO.

Dependendo da sua criatividade, você poderia primeiro compactar o arquivo com zip ou arj. Uma vez compactado, você poderia criar uma função que leia o arquivo byte a byte e transforme ele em Hexadecimal cada caracter, esse valor vai estar no modo texto e daí então gravá-lo no campo MEMO. Para poder ler o conteúdo, você precisará fazer a operação inversa: transformar hex em decimal, gravar em arquivo zip/arj e descompactá-lo. Uma operação um tanto esquisita, mas tá ai uma forma que poderia ser feita em Clipper.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder