PDA

Ver la Versión Completa : Ayuda con variable tipo File


JerS
18-02-2013, 14:28:44
Amigos tengo una duda, con el manejo de variables tipo File

yo tengo almacenado en mi base de datos una plantilla de tipo blob y quiero asignarla a una variable tipo file esto es posible? o me recomiendan utilizar TMemoryStream o TFileStream

ecfisa
18-02-2013, 17:08:04
Hola JerS.

Habría que ver el caso con detalle para evaluar la conveniencia de usar archivos sin tipo para realizar la lectura/escritura de los campos blob.

Pero dado que la clase TBlobField posee los métodos LoadFromStream y SaveToStream, creo que sería más sencillo usando un descendiente de TStream.

Saludos.

Neftali [Germán.Estévez]
18-02-2013, 17:16:04
¿Qué es una plantilla de tipo blob? Para tí, me refiero. Se supone que blob es cualquier cosa que sea "binaria".
¿Qué es una variable de tipo File (FileHandle)?

Tal vez si nos explicas qué es el blob y qué quieres hacer con él, nos aclare algo más...

JerS
22-02-2013, 21:11:04
Amigos ncfisa y neftali
Voy a ser un poco mas claro con ustedes, tengo unas SDK de identificación biometrica pero funciona guardando las huellas o templates en archivos, pero me gustaria manejarlo con Base de Datos, por eso creo conveniente cambiar lla variable File por TMemoryStream o cualquiera que ustedes me recomienden. aqui les dejo un Ejm del codigo :



var
fPtr: file;
lpRec: LPDBREC;
dSize: DWORD;
rdTotal: Integer;

begin
// get record's data length
AssignFile( fPtr, fName );
Reset( fPtr, 1 );
BlockRead( fPtr, dSize, sizeof( DWORD ), rdTotal );
if rdTotal <> sizeof( DWORD ) then
begin
CloseFile( fPtr );
GetRecord := nil;
Exit;
end;

// allocate memory for record
lpRec := AllocRecordMem( dSize );

// read key information
BlockRead( fPtr, lpRec.key, sizeof( FTR_DATA_KEY ), rdTotal );
if rdTotal <> sizeof( FTR_DATA_KEY ) then
begin
CloseFile( fPtr );
FreeRecordMem( lpRec );
GetRecord := nil;
Exit;
end;

// read biometric data
BlockRead( fPtr, PChar( lpRec.data )^, dSize, rdTotal );
if DWORD( rdTotal ) <> dSize then
begin
CloseFile( fPtr );
FreeRecordMem( lpRec );
GetRecord := nil;
Exit;
end;

// success
CloseFile( fPtr );
GetRecord := lpRec;
end;

Ñuño Martínez
25-02-2013, 12:08:04
Por lo que sé, a una variable tipo FILE sólo se le pueden asignar archivos. Estos no tienen por qué ser archivos físicos en disco, ya que también pueden asignársele archivos virtuales como "crt:" o "lpt1:", por poner dos ejemplos. En definitiva, si el sistema operativo permite acceder a "algo" vía archivo, entonces puedes "asignarlo" a una variable tipo FILE. Algunos sistemas operativos permiten acceder a la memoria mediante archivos virtuales, y dado que un "blob" se puede almacenar en memoria, es posible que puedas hacerlo; pero hasta aquí puedo leer ya que no tengo ni idea de cómo se hace. Quizá buscando en la MSDN (http://msdn.microsoft.com/es-es/) encuentres algo.

JerS
25-02-2013, 15:31:40
Por lo que sé, a una variable tipo FILE sólo se le pueden asignar archivos. Estos no tienen por qué ser archivos físicos en disco, ya que también pueden asignársele archivos virtuales como "crt:" o "lpt1:", por poner dos ejemplos. En definitiva, si el sistema operativo permite acceder a "algo" vía archivo, entonces puedes "asignarlo" a una variable tipo FILE. Algunos sistemas operativos permiten acceder a la memoria mediante archivos virtuales, y dado que un "blob" se puede almacenar en memoria, es posible que puedas hacerlo; pero hasta aquí puedo leer ya que no tengo ni idea de cómo se hace. Quizá buscando en la MSDN (http://msdn.microsoft.com/es-es/) encuentres algo.

Pero si hay forma de sustituir el File por un tipo de dato TMemoryStream asignándole el valor desde un Blob

ecfisa
25-02-2013, 18:12:32
Hola Jers.

Ahora estoy un poco confundido sobre que es lo que buscas hacer. Pero fijate si de este hilo (http://www.clubdelphi.com/foros/showthread.php?p=446334) podés sacar alguna idea.

Saludos.

JerS
25-02-2013, 18:32:06
Hola Jers.

Ahora estoy un poco confundido sobre que es lo que buscas hacer. Pero fijate si de este hilo (http://www.clubdelphi.com/foros/showthread.php?p=446334) podés sacar alguna idea.

Saludos.

Lo que intento hacer es cambiar el codigo que publique , el cual utiliza una variable tipo file, ya que usa un archivo , por un codigo que en vez de usar un archivo traiga la información de un campo blob y pueda manipularla tal cual manipula el archivo

ecfisa
25-02-2013, 21:38:42
por un codigo que en vez de usar un archivo traiga la información de un campo blob y pueda manipularla tal cual manipula el archivo
Hola JerS.

La función BlobToRecord del enlace que te pasé, pasa el contenido de un TBlobField a una variable de tipo record (supongo que LPDBREC es un tipo apuntador a record). Claro que tendrás que modificar algunas cosas como el tipo del parámetro, pero si entendí bien tendría que funcionar.

Lo que realmente me confunde es que quieras asignar una variable tipo BLOB a una tipo FILE, ya que aún superando las dificultades que te comenta Ñuño, no veo que funcionalidad podría tener. Es decir ¿ Deseas pasar la variable BLOB como handle de un tipo FILE ?

Saludos.

nlsgarcia
26-02-2013, 01:59:45
JerS,


...tengo almacenado en mi base de datos una plantilla de tipo blob y quiero asignarla a una variable tipo file esto es posible?...

Entiendo que en tu BD tienes un campo Blob y quieres almacenar en este un archivo binario.


...tengo unas SDK de identificación biometrica pero funciona guardando las huellas o templates en archivos, pero me gustaria manejarlo con Base de Datos...

Corolario de lo anterior.

Revisa estos links:

Working With BLOBs Using Delphi:
http://www.onlinedelphitraining.com/newsletters/blobs.htm

How save a file in BLOB and use later:
http://www.scalabium.com/faq/dct0141.htm
Espero sea útil :)

Nelson.

JerS
07-03-2013, 00:16:47
Amigos en mi ignorancia a la hora de manejar archivos queria saber que se hace exactamente en esta función:

BlockRead( fPtr, PChar( lpRec.data )^, dSize, rdTotal );
if DWORD( rdTotal ) <> dSize then
begin
CloseFile( fPtr );
FreeRecordMem( lpRec );
GetRecord := nil;
Exit;
end;

para hacer lo mismo pero con mi variable TMemory

ecfisa
07-03-2013, 15:39:20
Amigos en mi ignorancia a la hora de manejar archivos queria saber que se hace exactamente en esta función:
...

Hola JerS.

Me parece que la explicación es mas clara comentando el código:

{ BlockRead lee uno o mas registros lógicaos a partir de la
posición actual del archivo y los almacena en una variable }
BlockRead(fPtr, // file
PChar(lpRec.data)^, // variable
dSize, // nro de registros
rdTotal); // registros leidos

{ Si el número de registros leidos difiere de los solicitados ...}
if DWORD(rdTotal) <> dSize then
begin
CloseFile(fPtr); // cerrar file
FreeRecordMem(lpRec); // ?? (supongo libera puntero a record)
GetRecord := nil; // pone a nulo el puntero GetRecord
Exit; // sale del procedimiento/funcion
end;


Saludos.