Yomarcol
23-09-2013, 14:17:17
hola a todos:
Estoy programando una aplicación en Delphi 5 en la que he acceder a un blob mediante componentes TOCIQUery. Uso Delphi 5 y el driver de Oracle SqlORA32.dll.
Tengo una tabla que tiene un campo CLOB_INI (tipo CLOB) que contiene un ini para una aplicación. En principio, revisando este foro, encontré el modo de leer y escribir, pero no sé por qué, a la hora de leer el campo, aparece un error ORA-3123: La operación se bloquearía.
Esto hace que no pueda descargar el ini ni poderlo manejar. el procedure que utilizo es éste (hay cosas comentada porque he querido verificar que realmente accedía a la bbdd y encontraba al menos un registro).
Si he puesto algo incorrecto, por favor decírmelo (tanto en el mensaje como en el código en sí...)
Saludos y gracias adelantadas
procedure LeerIni(mi_ini:TStream);
var
Qry : TOCIQuery;
tmp_ini:TStream;
MS: TMemoryStream;
BlobField: TField;
blob: TBlobStream;
begin
Qry := TOCIQuery.Create(nil);
MS := TMemoryStream.Create;
try
Qry.DatabaseName := dmSql.DatabaseBLOB.DatabaseName;
Qry.SQL.Add('SELECT *');
Qry.SQL.Add(' FROM TABLA_INI');
Qry.SQL.Add(' WHERE NOM_INI= ''fichero_ini'' ');
try
Qry.Open;
except
on e:exception do
begin
ShowMessage('Error cargando ini de BBDD: ' + e.Message);
end;
end;
{ qry.SQL.SaveToFile('c:/query1.txt');
if Qry.RecordCount >0
then Showmessage('hay un registro');}
with Qry do
begin
tmp_ini := CreateBlobStream(Qry.FieldbyName('CLOB_INI') as TBlobField, bmRead);
end;
//Qry.Free;
try
tmp_ini.Seek(0, soFromBeginning);
//contenidoIni.Seek(0, soFromBeginning);
with TFileStream.Create( DIRECTORIO_INI + NOMBRE_INI, fmCreate) do
try
CopyFrom(tmp_ini, tmp_ini.Size)
finally
Free
end;
finally
tmp_ini.Free;
end;
finally
Qry.Free;
end;
end;
Estoy programando una aplicación en Delphi 5 en la que he acceder a un blob mediante componentes TOCIQUery. Uso Delphi 5 y el driver de Oracle SqlORA32.dll.
Tengo una tabla que tiene un campo CLOB_INI (tipo CLOB) que contiene un ini para una aplicación. En principio, revisando este foro, encontré el modo de leer y escribir, pero no sé por qué, a la hora de leer el campo, aparece un error ORA-3123: La operación se bloquearía.
Esto hace que no pueda descargar el ini ni poderlo manejar. el procedure que utilizo es éste (hay cosas comentada porque he querido verificar que realmente accedía a la bbdd y encontraba al menos un registro).
Si he puesto algo incorrecto, por favor decírmelo (tanto en el mensaje como en el código en sí...)
Saludos y gracias adelantadas
procedure LeerIni(mi_ini:TStream);
var
Qry : TOCIQuery;
tmp_ini:TStream;
MS: TMemoryStream;
BlobField: TField;
blob: TBlobStream;
begin
Qry := TOCIQuery.Create(nil);
MS := TMemoryStream.Create;
try
Qry.DatabaseName := dmSql.DatabaseBLOB.DatabaseName;
Qry.SQL.Add('SELECT *');
Qry.SQL.Add(' FROM TABLA_INI');
Qry.SQL.Add(' WHERE NOM_INI= ''fichero_ini'' ');
try
Qry.Open;
except
on e:exception do
begin
ShowMessage('Error cargando ini de BBDD: ' + e.Message);
end;
end;
{ qry.SQL.SaveToFile('c:/query1.txt');
if Qry.RecordCount >0
then Showmessage('hay un registro');}
with Qry do
begin
tmp_ini := CreateBlobStream(Qry.FieldbyName('CLOB_INI') as TBlobField, bmRead);
end;
//Qry.Free;
try
tmp_ini.Seek(0, soFromBeginning);
//contenidoIni.Seek(0, soFromBeginning);
with TFileStream.Create( DIRECTORIO_INI + NOMBRE_INI, fmCreate) do
try
CopyFrom(tmp_ini, tmp_ini.Size)
finally
Free
end;
finally
tmp_ini.Free;
end;
finally
Qry.Free;
end;
end;