Jump to content

[Ajuda] adicionar pdf em Blob


CanonTG
 Share

Recommended Posts

Boas, ao tentar adicionar um pdf á minha base de dados dá este erro "Cannot open file “C:\Users\Catia.Lopes\Desktop\3Semana.pdf” o processo não pode aceder ao ficheiro porque este está a ser utilizado por outro processo"

alguém sabe o que se passa?

No edit3 tenho o caminho para o ficheiro seleccionado



 Query.Insert;
 Query.FieldByName('nOportunidade').AsInteger :=maior;
 Query.FieldByName('nomeOport').AsString :=Edit6.Text;
 Query.FieldByName('username').AsString :=Edit2.Text;
 Query.FieldByName('data').AsDateTime :=Date();
 Query.FieldByName('hora').AsDateTime :=Time;
 Query.FieldByName('nomeArq').AsString := nomeArquivoOport;
 Query.FieldByName('observacoes').AsString :=Memo1.Text;
//add ficheiro blob

 blob := Query.CreateBlobStream(Query.FieldByName('anexos'), bmWrite);try
blob.Seek(0, soFromBeginning);
 try
blob.CopyFrom(TFileStream.Create(Edit3.Text, fmOpenRead), TFileStream.Create(Edit3.Text, fmOpenRead).Size)
 finally

TFileStream.Create(Edit3.Text, fmOpenRead).Free
 end;
 finally
  blob.Free;
 end;

Query.Post;

Edited by CanonTG
Link to comment
Share on other sites

Boas, ao tentar adicionar um pdf á minha base de dados dá este erro "Cannot open file “C:\Users\Catia.Lopes\Desktop\3Semana.pdf” o processo não pode aceder ao ficheiro porque este está a ser utilizado por outro processo"

alguém sabe o que se passa?

No edit3 tenho o caminho para o ficheiro seleccionado



 Query.Insert;
 Query.FieldByName('nOportunidade').AsInteger :=maior;
 Query.FieldByName('nomeOport').AsString :=Edit6.Text;
 Query.FieldByName('username').AsString :=Edit2.Text;
 Query.FieldByName('data').AsDateTime :=Date();
 Query.FieldByName('hora').AsDateTime :=Time;
 Query.FieldByName('nomeArq').AsString := nomeArquivoOport;
 Query.FieldByName('observacoes').AsString :=Memo1.Text;
//add ficheiro blob

 blob := Query.CreateBlobStream(Query.FieldByName('anexos'), bmWrite);try
blob.Seek(0, soFromBeginning);
 try
blob.CopyFrom(TFileStream.Create(Edit3.Text, fmOpenRead), TFileStream.Create(Edit3.Text, fmOpenRead).Size)
 finally

TFileStream.Create(Edit3.Text, fmOpenRead).Free
 end;
 finally
  blob.Free;
 end;

Query.Post;

Sim muito provavelmente ele não está a encontrar o ficheiro como o proprio erro diz,

experimenta só a apontar o edit3.text para c:\teste.pdf, eu não sei se tens o nome do ficheiro ficheiro ou nao, mas suponho que sim,

em todo o caso coloca-o em C:\ e testa por favor.

Edited by CrominhO

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

nao graves dados binarios na bd... é um conselho valioso que te dou!

guarda a localizaçao apenas

Mas porquê? tirando o facto da BD ficar obviamente maior, existe mais alguma razão ? 🙂

Edited by CrominhO

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

db maior, logo, queries mais lentas... acredita, nao existem praticamente vantagens!

e o acesso aos dados é mais complicado... so traz problemas! xD

Eu acredito amigo 🙂 aliás todos nós aprendemos que isso não deve ser feito 🙂 mas como cada vez mais as Aplicações estão viradas para a web há alturas que não da mesmo para evitar.

Eu só perguntei, porque por exemplo MySql + JPG gravado no PhotoShop dá logo Erro 51, pensei que pudesse haver aí alguma coisa com PDFs que eu não soubesse 🙂

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

Só colocando o C:\ e nome do ficheiro da erro que não consegue localizar o ficheiro. E se eu colocar o ficheiro no C:\ dá o erro inicial

Pois mas eu tenho mesmo de guardar os ficheiros

Oi Canon, eu não consigo ver as variáveis que criaste e também te faltava criar o Stream, experimenta lá assim por favor,

procedure TForm1.SavetoBlobClick(Sender: TObject);
var
  blob: TBlobStream;
  TempStrm: TMemoryStream;
begin
 // cria o Blob 
   blob := Query.CreateBlobStream(Query.FieldByName('anexos'), bmWrite);  
   try
 // aponta para o inicio
 blob.Seek(0, soFromBeginning);
 // cria o bloco de memória	
 TempStrm := TMemoryStream.Create;
 // le PDF	
  gtPDFDocument1.LoadFromFile('C:\Input.pdf');

 // salva PDF para bloco de memoria	
  gtPDFDocument1.SaveToStream(TempStrm);
 // vai para o inicio do bloco	
  TempStrm.Position := 0;
 // copia do Bloco para o Blob	
 try
   blob.CopyFrom(TempStrm, TempStrm.Size)
 finally
   TempStrm.Free
 end;
  finally
 blob.Free
  end;
end;

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

Eu resolvi com este código


var
FileStream: TFileStream;
 BlobStream: TStream;

begin

Query.Insert;
Query.FieldByName('nOportunidade').AsInteger :=maior;
Query.FieldByName('nomeOport').AsString :=Edit6.Text;
Query.FieldByName('username').AsString :=Edit2.Text;
Query.FieldByName('data').AsDateTime :=Date();
Query.FieldByName('hora').AsDateTime :=Time;
Query.FieldByName('observacoes').AsString :=Memo1.Text;
//add ficheiro blob

if(Edit3.Text <> '') then
  begin
 BlobStream := Query.CreateBlobStream(Query.FieldByName('anexos'),bmWrite);
 FileStream := TFileStream.Create(Edit3.Text ,fmOpenRead or fmShareDenyNone);
 BlobStream.CopyFrom(FileStream,FileStream.Size);
 FileStream.Free;
 BlobStream.Free;
  end;
 Query.Post;
end

Agora não estou a conseguir é editar o campo blob, tens alguma ideia?

Edited by CanonTG
Link to comment
Share on other sites

Eu resolvi com este código

Agora não estou a conseguir é editar o campo blob, tens alguma ideia?

Ok, ainda bem.

Eu não percebi o que queres dizer com "Editar", alterar depois de introduzir?

Que eu saiba não dá, esse Campo dá para ler e para escrever, se depois de Leres quiseres alterar, tens de voltar a

introduzir como fizeste na Introdução.

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

Sim é alterar, eu já tentei mas não consigo introduzir num sítio especifico e eu altero mais dados para além do blob

Tás a fazer Query.Edit e Query.Post ? 🙂 é que isto só funciona se tiveres uma chave na tabela para ele saber onde está o "cursor",

ele da-te erro se tentares fazer ?

Query.Edit;
Query.FieldByName('username').AsString :=' novo teste';
Query.Post;
Edited by CrominhO

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

não existem informações suficientes sobre a coluna chave para actualizar

dá este erro


//atualizar as fasesoportunidades
 Query1.SQL.Clear;
 Query1.SQL.Add('UPDATE fasesoportunidades SET observacoes='''+Memo1.Text+''', '
 +'nomeArq='''+nomeArquivoF+''' '
 +'where nOportunidade='''+Edit9.Text+''' and nFase='''+Edit10.Text+''' ');
 Query1.ExecSQL;


 Query2.SQL.Clear;
 Query2.SQL.Text :='select anexos from fasesoportunidades where '
 +'nOportunidade='''+Edit9.Text+''' and nFase='''+Edit10.Text+''' and codOC='''+Label6.Caption+''' ';
 Query2.Open;


 Query2.Edit;
       BlobStream := Query2.CreateBlobStream(Query2.FieldByName('anexos'),bmWrite);
    FileStream := TFileStream.Create(Edit8.Text ,fmOpenRead or fmShareDenyNone);
    BlobStream.CopyFrom(FileStream,FileStream.Size);
    FileStream.Free;
    BlobStream.Free;

 Query2.Post;

Edited by CanonTG
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.