Guardar imagen en BD de PB7

Hola Carlos!
En mi aplicación necesito guardar varias imágenes, y me gustaría que se almacenaran en la base de datos o cuando menos poder copiarlas a la carpeta donde esta la aplicación: C:\App Pet Puff\img bd\", para mantenerlas a salvo de cualquier posible borrado.
Hasta ahora lo que he podido hacer es copiar la dirección y nombre del archivo en una variable (string) y guardarla en la BD. Pero no encuentro como almacenar una imagen dentro de las tablas de la BD o como copiar las imágenes a un directorio en especifico para que las guarde.
¿Es ésto posible con Power Builder v7? ¿O Necesito una nueva versión?
¿Qué me recomiendas?

1 respuesta

Respuesta
1
El que guarde o no la imagen de echo no depende del PB, si no del motor en donde desea guardarla, aquí te dejo un ejemplo, que inserta una imagen en SQL Server.
"Vamos a desarrollar un pequeño aplicativo, en donde
almacenaremos en una DB, una imagen, para despues poder visualizarla o cambiarla
por otra.
1. Creamos una tabla llamada 'alumnos_fotos' con 2 campos: 'cod_alumno' de tipo
char(2) y foto_alumno de tipo image(16), al campo cod_alumno lo ponemos como
Clave Principal.
A esta tabla le agregamos 3 registros con los codigos: '01', '02', y '03'
2. Creamos una Window con los siguientes objetos:
un Picture Control, llamado 'p_foto'
dos Command Button, llamados 'cb_cargar_foto' y 'cb_ver_foto' y
un Single Line Edit, llamado 'sle_cod_alumno'
3. En el evento clicked de 'cb_cargar_foto' poner el siguiente codigo:
STRING ls_pathname, ls_filename, ls_filtro, ls_cod_alumno
LONG ll_File
BLOB lbl_data, lbl_temp
ls_filtro = "JPEG Files (*.jpg),*.jpg," + "GIFF Files
(*.gif),*.gif,"
IF GetFileOpenName ( "Archivo de Imagen: ", ls_pathname, ls_filename
, "jpg", ls_filtro) = 0 THEN RETURN
p_foto.picturename = ls_pathname
ls_cod_alumno = trim(sle_cod_alumno.text)
ll_File = FileOpen(ls_pathname, StreamMode!)
DO WHILE FileRead(ll_file,lbl_temp) > 0
lbl_data += lbl_temp
LOOP
FileClose(ll_file)
IF ll_File -1 THEN
FileRead(ll_file, lbl_data)
FileClose(ll_file)
SQLCA.AutoCommit = True
UPDATEBLOB alumnos_fotos SET foto_alumno = :lbl_data WHERE cod_alumno =
:ls_cod_alumno;
SQLCA.AutoCommit = False
ELSE
messagebox('Error','Falló el FileOpen')
END IF
IF SQLCA.SQLNRows > 0 THEN
COMMIT;
messagebox('OK: ' + ls_cod_alumno,'Se guardó la foto del alumno')
ELSE
messagebox('Error','Falló el UPDATEBLOB')
END IF
FileClose(ll_file)
4. En el evento clicked de cb_ver_foto, copiar el codigo:
Blob lb_imagen
STRING ls_cod_alumno
ls_cod_alumno = trim(sle_cod_alumno.text)
SELECTBLOB foto_alumno INTO :lb_imagen FROM alumnos_fotos WHERE cod_alumno =
:ls_cod_alumno ;
p_foto.SetPicture(lb_imagen)
5. Ejecutar y probar:
Escribimos el código '01' en sle_cod_alumno, le damos click en cb_cargar_foto y
seleccionamos el archivo que se va a guardar en la DB. Repetimos este paso para
los demás códigos '02' y '03'. Luego, probamos el boton cb_ver_foto, para cada
codigo.
Llego mal, aquí te la envío de nuevo
El que guarde o no la imagen de echo no depende del PB, si no del motor en donde desea guardarla, aquí te dejo un ejemplo, que inserta una imagen en SQL Server.
"Vamos a desarrollar un pequeño aplicativo, en donde almacenaremos en una DB, una imagen, para después poder visualizarla o cambiarla por otra.
1. Creamos una tabla llamada 'alumnos_fotos' con 2 campos: 'cod_alumno' de tipo char(2) y foto_alumno de tipo image(16), al campo cod_alumno lo ponemos como Clave Principal.
A esta tabla le agregamos 3 registros con los códigos: '01', '02', y '03'
2. Creamos una Window con los siguientes objetos:
un Picture Control, llamado 'p_foto'
dos Command Button, llamados 'cb_cargar_foto' y 'cb_ver_foto' y
un Single Line Edit, llamado 'sle_cod_alumno'
3. En el evento clicked de 'cb_cargar_foto' poner el siguiente codigo:
STRING ls_pathname, ls_filename, ls_filtro, ls_cod_alumno
LONG ll_File
BLOB lbl_data, lbl_temp
ls_filtro = "JPEG Files (*.jpg),*.jpg," + "GIFF Files (*.gif),*.gif,"
IF GetFileOpenName ( "Archivo de Imagen: ", ls_pathname, ls_filename , "jpg", ls_filtro) = 0 THEN RETURN
p_foto.picturename = ls_pathname
ls_cod_alumno = trim(sle_cod_alumno.text)
ll_File = FileOpen(ls_pathname, StreamMode!)
DO WHILE FileRead(ll_file,lbl_temp) > 0
lbl_data += lbl_temp
LOOP
FileClose(ll_file)
IF ll_File -1 THEN
FileRead(ll_file, lbl_data)
FileClose(ll_file)
SQLCA.AutoCommit = True
UPDATEBLOB alumnos_fotos SET foto_alumno = :lbl_data WHERE cod_alumno = :ls_cod_alumno;
SQLCA.AutoCommit = False
ELSE
messagebox('Error','Falló el FileOpen')
END IF
IF SQLCA.SQLNRows > 0 THEN
COMMIT;
messagebox('OK: ' + ls_cod_alumno,'Se guardó la foto del alumno')
ELSE
messagebox('Error','Falló el UPDATEBLOB')
END IF
FileClose(ll_file)
4. En el evento clicked de cb_ver_foto, copiar el codigo:
Blob lb_imagen
STRING ls_cod_alumno
ls_cod_alumno = trim(sle_cod_alumno.text)
SELECTBLOB foto_alumno INTO :lb_imagen FROM alumnos_fotos WHERE cod_alumno = :ls_cod_alumno ;
p_foto.SetPicture(lb_imagen)
5. Ejecutar y probar:
Escribimos el código '01' en sle_cod_alumno, le damos click en cb_cargar_foto y seleccionamos el archivo que se va a guardar en la DB. Repetimos este paso para los demás códigos '02' y '03'. Luego, probamos el botón cb_ver_foto, para cada código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas