Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Firebird: Guardar de imágenes

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Firebird: Guardar de imágenes Responder citando

Estoy teniendo problemas al insertar imágenes en una tabla Firebird. Tengo estos dos querys:
    1. Para crear un registro nuevo
    Código:
    Query->SQL->Text = "INSERT INTO Imagenes (Tabla, Registro, Posicion, Caratula) VALUES (:Tabla, :Registro, :Posicion, :Caratula)";

    2. Para actualizar uno existente
    Código:
    Query->SQL->Text = "UPDATE Imagenes SET Caratula = :Caratula WHERE Tabla = :Tabla AND Registro = :Registro AND Posicion = :Posicion";

La imagen está en un TImage del formulario y hago esto:
Código:
TMemoryStream *msImagen = new TMemoryStream;

msImagen->Clear();
(Image1->Picture->Bitmap)->SaveToStream(msImagen);

msImagen->Seek(0,soFromBeginning);
Query->Close();
Query->ParamByName("Tabla")->AsString     = "P";
Query->ParamByName("Registro")->AsInteger = nDisco;
Query->ParamByName("Posicion")->AsString  = "P";
Query->ParamByName("Caratula")->LoadFromStream(msImagen, ftBlob);
Query->Prepare();
Query->ExecSQL();

Y no consigo que guarde la imagen que estoy viendo en el TImage. He estado mirando las preguntas que hay por el foro sobre este tema (varias mías) y no encuentro la forma de lograrlo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, no estoy seguro pero creo que las consultas solo manejan texto en el SQL, haz un ShowMessage con el texto de la query despues de ejecutada y mira a ver que pasa.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Todo aclarado. El código funciona perfectamente; lo que no funciona perfectamente son mis neuronas Laughing y había un error de concepto: La tabla donde guardo las imágenes no es la misma que donde están guardadas las fichas correspondientes y al grabar no buscaba si la imagen existía o no, buscaba si existía la ficha.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Error al recuperar IMAGEN Responder citando

Hola, tome tu ejemplo para el manejo de imagen y tengo el problema al recuperar la imagen, solamente me aprece la mitad de la imagen correcto y la otra midad me muestra caracteres asci.

A que crees que se deba este problema, no se esta grabando bien o simplemente no lo trae bien. Te anexo mi codigo.

----GRABAR LA IMAGEN EN LA DB.
void __fastcall TfrmSelEmpresa::RzBitBtn1Click(TObject *Sender)
{
// Crea un TJPEGIMAGE y carga imagen.jpg
TJPEGImage *JImage = new TJPEGImage;
if (opdOpenImagen->Execute())
{
if (FileExists(opdOpenImagen->FileName))

JImage->LoadFromFile(opdOpenImagen->FileName);
Image1->Picture->Assign(JImage);

try
{
//GUARDAR LA IMAGEN EN BASE DE DATOS
dmCliente->dbProveedor->StartTransaction();
TMemoryStream *msImagen = new TMemoryStream;
TJPEGImage *jpg = new TJPEGImage();
msImagen->Clear();
// cargo el archivo..
jpg->LoadFromFile(opdOpenImagen->FileName);
jpg->SaveToStream(msImagen);
msImagen->Clear();
(Image1->Picture->Bitmap)->SaveToStream(msImagen);

msImagen->Seek(0,soFromBeginning);

if (msImagen != NULL) {
qsFoto->Close();
qsFoto->ParamByName("idCia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsFoto->Open();
if (qsFoto->IsEmpty() ) {
qiFoto->Close();
qiFoto->ParamByName("idcia")->AsString = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qiFoto->ParamByName("foto" )->LoadFromStream(msImagen, ftBlob );
qiFoto->Prepare();
qiFoto->ExecSQL();
}else {
quFoto->Close();
quFoto->ParamByName("foto" )->LoadFromStream(ImagenToStream(opdOpenImagen->FileName ), ftBlob );
quFoto->ParamByName("idcia")->AsString = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
quFoto->Prepare();
quFoto->ExecSQL();
}
}else {
ShowMessage("IMAGEN VACIA");
}
dmCliente->dbProveedor->Commit();
}
catch(...)
{ dmCliente->dbProveedor->Rollback();
}
CargarImagen(opdOpenImagen->FileName);
}
//eliminas el temporal para
delete JImage;
}

----AQUI RECUPERO LA IMAGEN GRABADA.
void __fastcall TfrmSelEmpresa::lstEmpresaClick(TObject *Sender)
{
//CARGAR LA FOTO
stEmpresaSel = lstEmpresa->Items->Strings[lstEmpresa->ItemIndex];
iPos = stEmpresaSel.AnsiPos(".");
qsSelCia->Close();
qsSelCia->ParamByName("Cia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsSelCia->Open();

qsSucursales->Close();
qsSucursales->ParamByName("Cia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsSucursales->Open();

//TRAE LA IMAGEN DEL DIRECTORIO ASIGNADO

TJPEGImage *JImage = new TJPEGImage;
//PARA TRAER LA FOTO DE LA BASE DE DATOS
qsFoto->Close();
qsFoto->ParamByName("idCia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsFoto->Open();
String imagen = (qsFoto->FieldByName("foto")->AsString);
if(imagen!="")
{
TJPEGImage *jpg = new TJPEGImage();
Image1->Picture->Assign(BlobToJpg(((TBlobField*)qsFoto->FieldByName("foto") )));
delete jpg;
}
}
//---------------------------------------------------------------------------
TJPEGImage* __fastcall TfrmSelEmpresa::BlobToJpg(TBlobField *CampoBLOB)
{
if(!CampoBLOB->Value.IsEmpty())
{
TJPEGImage *JPeg = new TJPEGImage;
TMemoryStream *StreamTmp = new TMemoryStream;
CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream
StreamTmp->Seek(0,soFromBeginning);
JPeg->LoadFromStream(StreamTmp);
return(JPeg);
}
else
return(NULL);
}
//---------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Te pongo el código que estoy usando para volcar las imágenes en un QRImage:
Código:
qFoto->SQL->Text = "SELECT Foto FROM 'Fotos.db' WHERE Socio = " + Trim(Socio->Text);
qFoto->Open();

Application->CreateForm(__classid(TfCarnet), &fCarnet);
cPdfFile = ExtractFilePath(Application->ExeName) + "Adjuntos\\Socio" + FormatFloat("0", Query->FieldByName("Socio")->AsInteger) + ".pdf";

TQRPDFDocumentFilter *fFiltro = new TQRPDFDocumentFilter(cPdfFile);
fFiltro->AddFontMap("Arial:Helvetica");
fFiltro->StartConcat();

jpg = new TJPEGImage;
stream = new TMemoryStream;

((TBlobField*)qFoto->FieldByName("Foto"))->SaveToStream(stream);
stream->Seek(0, soFromBeginning);
jpg->LoadFromStream(stream);

if (stream->Size != 0)
     fCarnet->QRImage3->Picture->Assign(jpg);

fCarnet->qCarnet->ExportToFilter(fFiltro);
fFiltro->EndConcat();
delete fFiltro;

Con esto a mi no me da problemas.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Traer imagen de base de datos Responder citando

Muchas gracias por el codigo. Fijate que ya vi el problema y no era la rutina si no el tamaño de la imagen.
El JPG que estoy grabando tiene 129kb creo que por eso no me lo mostraba correctamente. ahora puse otro pero de 56kb y perfectamente lo desplega.

Ahora surge otro detalle como debo definir en mi base el tamaño de mi campo blob?

Gracias x tu ayuda.
Pako.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Re: Traer imagen de base de datos Responder citando

francisco rocha escribió:
Ahora surge otro detalle como debo definir en mi base el tamaño de mi campo blob?

No tienes que decirle nada sobre el tamaño del campoo blob al definir la base de datos más allá del tipo de dato que se va guardar en ese campo. Ten en cuenta que en esos campos se pueden guardar tanto imágenes co, por ejemplo, un fichero pdf.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.