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 

Insercion de imágenes en una base de datos...(No me sale)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Insercion de imágenes en una base de datos...(No me sale) Responder citando

Hola a todos,
en primer lugar decir que estoy iniciandome en esto del builder.
Tengo un problema cuando intento insertar una imagen desde archivo, en un campo TOLE de una base de datos. Yo lo intento hacer así:

if(OpenPictureDialog1->Execute())
{
DBImageFoto->Picture->LoadFromFile(OpenPictureDialog1->FileName);

//nos posicionamos en el registro adecuado (en la fila)
DataModule2->tbSocios->GotoBookmark(DataModule2->tbSocios->GetBookmark());
//preparamos para la edicion;
DataModule2->tbSocios->Edit();
DataModule2->tbSociosFOTO->LoadFromFile(OpenPictureDialog1->FileName);
try{
DataModule2->tbSocios->Post();
}
catch(...)
{
DataModule2->tbSocios->Cancel();

}
DataModule2->tbSocios->FreeBookmark(DataModule2->tbSocios->GetBookmark());
//DataModule2->tbSocios->Fields->Count
}

Nota:
tbSociosFOTO es el campo de la base de datos tbSocios, del tipo TOLE.
También lo he probado poner TGraphic y nada de nada.

Me sale un error en tiempo de ejecucion, diciendome que el tipo de imagen no es la adecuada.
Tambien he insertado la librería jpeg.hpp, para poder insertar archivos jpg.
Bueno eso es todo. Espero haberme explicado bien y que alquien me ayude, sorry.
Muchas Gracias.
Volver arriba
Mensaje    Asunto: Responder citando

Hola!

Mira este mensaje:

https://cppbuilder.es/viewtopic.php?t=3467

Suerte!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Gracias Marky por tu ayuda, pero sigue sin funcionar Responder citando

Marky escribió:
Hola!

Mira este mensaje:

https://cppbuilder.es/viewtopic.php?t=3467

Suerte!

Muchas Gracias Very Happy , pero sigue sin funcionar. Al hacerlo como me dices me sale ahora una mensaje tal que así:

Project Project1.exe raised exception clase EDBEngineErro with message “Record locke by another user. Table C:\MIS DOCUMENTOS\COCHES\VEHICULO.DB
User: pcchezqui”. Proccess stopped. Use Step or Run to continue


No se si es que no me situo bien en el registro adecuado, pero como dije en un principio, antes de intentar escribir en la tabla, me situo mediante el
//nos posicionamos en el registro adecuado (en la fila)
DataModule2->tbSocios->GotoBookmark(DataModule2->tbSocios->GetBookmark()); //preparamos para la edicion;
DataModule2->tbSocios->Edit();

De todas formas muchas gracias en invertir tu tiempo en mi pbma.
Volver arriba
Mensaje    Asunto: Responder citando

El código que te comento es perfectamente funcional (yo lo uso y no da ni un problema) con la única pega que solo vale para guardar/leer jpgs.

El problema está al situarte en el registro marcado en la base de datos. Debes tener configurado el TSession o algún componente de acceso a datos de forma errónea por lo que no te deja modificar el registro,
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: gracias por la seguda respuesta Marky, pero ahora otro fallo Responder citando

Ante todo muchas gracias Marky por tu ayuda.

Perdona también la tardanza, pero he tenido un problema de salud, del que afortunadamente estoy mejor.
Bueno, a lo que iba; solucionado el problema de la sesion, ahora, una vez introducido tu código, me sale un error distinto cuando intento guardar una imagen. El error es algo así:

Error jpg 41

Sin embargo el compilador no se cuelga con errores de memoria.
El código nuevo de la aplicacion es:

void __fastcall TForm1::ImageFotoDblClick(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
//Cargo la imagen en el dbEdit
ImageFoto->Picture->LoadFromFile(OpenPictureDialog1->FileName);
DataModule2->tbSocios->Edit();

//*******tu código*******
TJPEGImage *JPeg;
TMemoryStream *Corriente;
JPeg = new TJPEGImage;
Corriente = new TMemoryStream;
static_cast <TGraphicField *>(DataModule2->tbSociosFOTO)->SaveToStream(Corriente);
//DataSetOrigen en el TDataSet que le paso como parámetro
Corriente->Seek(0,soFromBeginning);
JPeg->LoadFromStream(Corriente);
ImageFoto->Picture->Assign(JPeg); //Imagen es un TImage
Corriente->Free();
JPeg->Free();
//mediante est ShoMessage he comprobado que me situo en
//el registro adecuado, y me situo bien
ShowMessage(DataModule2->tbSociosNOMBRE->Value);

static_cast<TGraphicField*>(DataModule2->tbSociosFOTO)->LoadFromFile(OpenPictureDialog1->FileName);
//***********************fin tu código

try{
DataModule2->tbSocios->Post();
}
catch(...)
{
DataModule2->tbSocios->Cancel();

}



Para cargar la imgen utilizo el evento Doble Click del DBImage.
Como cuando llamo al evento me encuentro en un determinado registro, no hace falta utilizar la marca, para posicionarme en el (lo he comprobado tambien).

Espero que te enteres.

Bueno, si puedes ayudarme muchas gracias y sino tambien.





}

}
Volver arriba
Mensaje    Asunto: Re: gracias por la seguda respuesta Marky, pero ahora otro f Responder citando

Es que aquí hay un pequeño problema de interpretación.

Para grabar la imagen en la base de datos es suficiente con usar el método LoadFromFile. Con esto, y tras llamar a Post(), la imagen ya quedaría grabada en el campo.

Con mi código lo que haces es visualizar el contenido del campo y cargarlo en un TImage, por ejemplo cuando editas un registro. No se si me entiendes, este código se usa para mostrar el contenido de un campo ftGraphic que ya fue grabado con anterioridad.

Por tanto, lo que te tiene que quedar claro es:

Para insertar la imagen en el campo
Código:

Tbl->Edit();
//meto la imagen en el TImagen                             Imagen->Picture->LoadFromFile(DialogoImagen1->FileName);
//meto la imagen en el campo
static_cast<TGraphicField *>(Tbl->FieldByName("Foto"))->LoadFromFile(DialogoImagen1->FileName);
Tbl->Post();


Para recuperar en un TImage una imagen que ya fue grabada en un campo
Código:

TJPEGImage *JPeg;
TMemoryStream *Corriente;
JPeg = new TJPEGImage;
Corriente = new TMemoryStream;
static_cast <TGraphicField *>(DataModule2->tbSociosFOTO)->SaveToStream(Corriente);
Corriente->Seek(0,soFromBeginning);
JPeg->LoadFromStream(Corriente);
ImageFoto->Picture->Assign(JPeg); //Imagen es un TImage
Corriente->Free();
JPeg->Free();



Espero que ahora te hayas aclarado
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: gracias markey Responder citando

Ante todo perdón por la tardanza.
Tenías razón, tu código funciona bien. El problema era debido a que yo utilizaba un TDBImage, en vez de un TImage. El componente al que hago referencia( TDBImage), sólo puede visualizar imágenes *.bmp y wmf.

Pues lo dicho, muchas gracias markey
Volver arriba
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.