Asunto: Problema al extraer datos campo RAW CLOB de Oracle - Delphi
En una aplicación hecha en Delphi que accede a bases de datos Oracle mediante ODBC utilizo un procedimiento que extrae los datos de un campo de tipo LONG RAW, en concreto son documentos de Word guardados en la tabla de Oracle.
He detectado que algunos documentos los extrae correctamente y otros no. Tras varias averiguaciones he visto que no extrae documentos de más de 32 KB, todos los que tienen más tamaño los extrae pero son ilegibles y nunca de más de 32 KB.
La estructura de la tabla que utilizo:
Código:
create table facturas
(
codigo NUMBER(22) PRIMARY KEY NOT NULL,
fecha DATE,
cliente VARCHAR2(100) NOT NULL,
rutafichero VARCHAR2(300),
datosfichero LONG RAW
)
El procedimiento Delphi que utilizo para extraer el contenido del campo "datosfichero" es:
Código:
...
if tcConsulta.Active then
begin
if tcConsulta.FieldByName(txtNombreCampoCLOB.Text).IsBlob then
TBlobField (tcConsulta.FieldByName(
txtNombreCampoCLOB.Text)).SaveToFile(
txtRuta.text + '\' +
tcConsulta.fieldbyname(txtNombreCampoDocumento.Text).AsString)
else
MessageDlg('El campo [' + txtNombreCampoCLOB.Text +
'] no es de tipo CLOB, RAW.', mtWarning, [mbok], 0);
end
else
MessageDlg('No hay datos para extraer. Ejecute una consulta SQL ' +
'antes de extraer el documento.', mtInformation, [mbok], 0);
...
tcConsulta -> TQuery.
¿es correcta la utilización de "TBlobField"?
Publicado:
Jue Abr 26, 2007 11:39 am
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: He probado con CLOB y tampoco va bien
Mirando por ahí, he visto que Oracle recomienda que no se utilice el tipo de datos LONG RAW, que está en desuso, en su defecto dice que se utilice CLOB, pero lo he probado con este tipo de datos y me ocurre lo mismo, sólo extrae 32 KB de los ficheros que ocupan más, los que ocupan menos los guarda bien.
Publicado:
Jue Abr 26, 2007 11:40 am
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: He mirado la configuración del Driver ODBC que utilizo
También he cambiado todas las opciones (para ir probando una a una) del ODBC que utilizo. Es Oracle 9 y he probado con:
No he conseguido que funcione correctamente con ninguna de las opciones.
Teniendo en cuenta que utilizas ODBC y Delphi, estás utilizando, también, el BDE (Borland Database Engine) que hace de "puente" entre ambos. Puedes ver un manual en este artículo:
Con lo cual la configuración del ODBC afecta, por supuesto, pero no es la única. El problema que te ocurre se soluciona fácilmente, si accedes a la configuración del BDE ("Inicio" - "Configuración" - "Panel de control" - "BDE Administrator"). Dentro del BDE Administrator verás dos pestañas / solapas: "Databases" y "Configuration". Si pulsas en "Databases" mostrará todos los motores de Base de Datos disponibles y, también, los drivers ODBC, entre ellos estará el que tú utilices para tu aplicación. Lo seleccionas y a la derecha te aparecerá una ventana con una serie de parámetros de configuración. El que nos interesa y el que te está limitando el tamaño, cuando intentas sacarlo de la base de datos, del campo de tipo LONG RAW o CLOB (TBlobField) es [BLOB SIZE] que tendrá el valor "32". La descripción de este parámetro (por el BDE Administrator) es: Maximum allowable blob size (in kilobytes) for canned queries.
Cuando cierres el BDE Administrator te preguntará si quieres guardar los cambios, con un mensaje como este:
Save all edits to BDE Administrator C:\Archivos de programa\Common Files\Borland Shared\BDE\IDAPI32.CFG?
Con lo cual, con ampliar el valor de este parámetro será suficiente para que te funcione la aplicación, pues el código que utilizas para sacar el documento con TBlobField es correcto. Deberás ampliarlo al mismo valor o mayor que el documento más grande que tengas en la tabla.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A