• Publicidad

Rescatar archivo binario de una BD

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Rescatar archivo binario de una BD

Notapor audax » 2016-01-27 08:55 @413

Buenas a todos.

Escribo por si alguien me puede ayudar.

Resulta que tengo un código que se conecta a una BD, el cual quiero rescatar un campo que es del tipo varbinary(MAX) (la BD está en SQL Server). Este campo contiene un pdf. Necesito rescatar este pdf, pero cuando hago el select en el código no me devuelve nada. Quizás sea un cambio pequeño pero no me resulta. ¿Alguien me puede ayudar cómo rescatar esto? De ante mano, muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $Cadena= "driver={SQL Server}; server=$servidor; database=$nombreBD; uid=$usuario; pwd=$password";
  2.  
  3. # Se abre una conexión con la base de datos.
  4. my $dbh=DBI->connect("dbi:ODBC:$Cadena");
  5.  
  6. my $SQL = "SELECT Pdf FROM AdjuntosDTE WHERE AdjuntosDTE.ID = 1;";
  7. my $sth2 = $dbh->prepare($SQL) or die "No puedo conectar a la base de datos";
  8. $sth2->execute;
  9. $dbh->{'LongTruncOk'} = 1;
  10. $dbh->{'LongReadLen'} = 2550000;
  11. my @record2 = $sth2->fetchrow(); # esta variable queda vacía, pero la consulta está correcta
  12. my $registro2 = $record2[0];     # esta variable me debería mostrar los valores en binario, algo como 0x255044462D..., pero no me muestra nada
  13. print "[$registro2]\n";
  14.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Disculpen las molestias.
Última edición por audax el 2016-01-28 15:27 @685, editado 1 vez en total
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Publicidad

Re: Rescatar archivo binario de una BD

Notapor explorer » 2016-01-27 16:41 @736

Disculpa, pero, ¿qué versión de DBI estás usando?

En las distintas versiones que tengo yo, en ninguna aparece el método fetchrow().

Pon

use warnings;

al principio del programa, para que Perl te avise, por ejemplo, de que estás usando un método inexistente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Rescatar archivo binario de una BD

Notapor audax » 2016-01-28 08:48 @408

Gracias, explorer.

Uso la DBI 1.631. El warning no me entregó ningún mensaje de error, además uso el IDE Komodo que también me entrega mensajes de error (que en esta oportunidad tampoco los tengo). Pero el tema es que he hecho muchos script con ese método para guardar diferentes datos de la BD y siempre me ha funcionado.

Créeme que he hecho varios script y primera vez que no me funciona.

Me está entregando un dato vacío, esperando un hexadecimal como me entrega cuando hago la consulta directamente en la consola del SQL Server (yo creo que es porque el tipo de dato es un VarBinary).

Ese es mi dilema, pero te confirmo que el método fetchrow() me ha funcionado muchas veces.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Rescatar archivo binario de una BD

Notapor MARKO » 2016-01-28 11:00 @500

Creo que hay un error de escritura en la variable $sth2 de la línea 11,
y en la variable $record2 de la línea 12.

El "or die" deberías ponerlo en la línea del connect (línea 4)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dbh=DBI->connect("dbi:ODBC:$Cadena") or die "No puedo conectar a la base de datos";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Éxitos.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: Rescatar archivo binario de una BD

Notapor audax » 2016-01-28 15:30 @687

Gracias, MARKO, tienes toda la razón, pero solo me equivoqué en traspasar el código. Al editarlo aquí en el foro me comí el "2" que tienen las variables. Gracias por advertir esto, pero el problema principal persiste: me sigue entregando vacío el resultado de la consulta, y no sé cómo hacer que pase ese valor y poder guardarlo en un pdf.

También cambie el die y no hubo cambios. Gracias, de verdad, por toda la ayuda.

Saludos.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Rescatar archivo binario de una BD

Notapor explorer » 2016-01-28 17:10 @757

Supongamos -que no lo sabemos- que fetchrow() es lo mismo que fetchrow_array(), ya que vemos que guardas el resultado en un array.

Lo que dice el manual de DBI sobre fetchrow_array() es lo siguiente:

Recupera la siguiente fila de datos y devuelve una lista conteniendo los valores de los campos. Los campos nulos se devuelven en la lista como valores "undef".

Si no existen más filas o si ocurre un error, entonces "fetchrow_array" devuelve una lista vacía. Debe chequear a continuación "$sth->err" (o usar el atributo "RaiseError") para descubrir si la lista vacía devuelta ha sido debido a un error.

Si se llama en contexto escalar para un gestor de sentencia que tenga más de una columna, no está definido si el controlador devolverá el valor de la primera columna o la última. Así que no lo haga. También, en contexto escalar, se devuelve un "undef" si no existen más filas o si ocurrió un error. Ese "undef" no se puede distinguir de un "undef" devuelto debido a que el primera campo fuese un NULL. Por estas razones, debería ejecutarse con precaución si usa "fetchrow_array" en contexto escalar.

Entonces, si a ti te devuelve un valor vacío, estamos en el primera caso: no hay ninguna fila que coincida con la consulta, o ha ocurrido un error.

Te aconsejo que hagas lo que dice el texto: saca el valor de $sth2->err después del fetchrow(), para ver si ocurrió un error.

Si no sale nada, es que la consulta no encontró nada.

¿Seguro que el campo se llama 'Pdf'? ¿No será 'PDF'? ¿O 'pdf'?

Otra cosa: yo pondría un valor 0 al atributo a 'LongTruncOk', para que, en el caso de que el resultado de la consulta sea muy grande -más grande que lo indicado por 'LongReadLen'-, acabe con un error, y así lo podremos reintentar con un valor más grande.

Otra cosa: el cambio de esos dos atributos se debe hacer justo antes del prepare(). El manual dice que si se hace después, el atributo 'LongReadLen' no tiene efecto, así que tú código también está mal en esa parte.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Rescatar archivo binario de una BD

Notapor audax » 2016-01-29 09:18 @429

Gracias, explorer, son varias cositas que tengo que analizar y cambiar. La próxima semana lo hago y les cuento qué resultado obtuve:

Muchas gracias por la ayuda.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Rescatar archivo binario de una BD

Notapor audax » 2016-04-25 11:19 @513

Después de un tiempo encontré la solución. Al final tuve que poner el archivo como binario y guardar la consulta en este archivo. En resumen, el código es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $SQL = "SELECT Adjuntos.Pdf FROM Adjuntos WHERE Adjuntos.ID = '$ID';";
  2.  
  3. $dbh->{'LongTruncOk'} = 1;
  4. $dbh->{'LongReadLen'} = 26214400;
  5. my $sth = $dbh->prepare($SQL) or die "No puedo conectar a la base de datos";
  6. $sth->execute;
  7.  
  8. open( FILE, ">", $pathEntrada . "\\test.pdf" );
  9. binmode FILE;                                  # set binmode
  10.  
  11. while ( my $row = $sth->fetchrow() ) {
  12.     print FILE $row;
  13.  
  14. }
  15. close FILE;
  16.  
  17. $sth->finish();
  18. $dbh->disconnect();
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero que a alguien le ayude. salu2
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 2 invitados