Programación de un lector de huella digital en Java. Parte 3.


Siguiendo con el tutorial para la programación de un lector de huellas en Java (si no has leído la parte 1 y parte 2 te recomiendo hacerlo antes de proceder) en este caso explicaré cómo almacenar los registros de las huellas en una base de datos en MySQL, anteriormente en la parte 1 hemos creado la base de datos con 3 columnas (el id, los datos de la huella y el nombre de la persona que la registró) ahora pasemos al código.

Recapitulando...

  • Se tienen únicamente 3 clases en el proyecto: la clase ejemplolectorhuellas.Maininterfaz.PantallaPrincipal procedimientos.Util, donde Main es a través de la cual se arranca el programa, PantallaPrincipal es la interfaz y Util es la clase que contiene los procedimientos.
  • Al realizar todos los procedimientos de la parte 2 del tutorial y ejecutar el programa se debe de enceder el lector de huellas, al colocar el dedo sobre el lector debe de aparecer la imagen de la huella capturada.

¿Hasta aquí todo bien? Si tu respuesta es afirmativa continúa con los siguientes pasos, de lo contrario regresa a las partes anteriores y verifíca que no tengas errores en la codificación.

Agregar los objetos para las consultas en procedimientos.Util::

Abrimos la clase procedimientos.Util y agregamos al inicio de la misma los siguientes objetos:

   /**Conexión a la base de datos*/
   private Connection dbConnection;
   
   /**Consultas preparadas**/
   private PreparedStatement guardarStmt;
   private PreparedStatement identificarStmt;
   private PreparedStatement verificarStmt;

Los objetos anteriores se utilizarán para crear la conexión a la base de datos y realizar consultas en la misma, para poder realizar lo anterior debemos de crear un par de métodos como se muestran a continuación:

   /**
    * Inicializa la conexión a la base de datos y prepara las operaciones para insertar, 
    * eliminar y modificar los datos
    */
   private void initDB() {
       try {
           //Carga el driver ODBC
           Class.forName("com.mysql.jdbc.Driver");

           //Se conecta a la bd
           dbConnection = DriverManager.getConnection("jdbc:mysql://servidor:3306/huellas","usuario", "contrasena");

           Statement stm = dbConnection.createStatement();
           
           //Prepara las consultas/sentencias que se utilizarán
           guardarStmt     = dbConnection.prepareStatement("INSERT INTO somhue(id, huenombre, huehuella) values(?,?,?)");
           identificarStmt   = dbConnection.prepareStatement("SELECT huehuella FROM somhue");
           verificarStmt     = dbConnection.prepareStatement("SELECT huehuella FROM somhue WHERE huenombre=?");
                   
       } catch (Exception e) {
           e.printStackTrace();
       }
       
   }
   
   /**
    * Cierra la conexión a la base de datos y libera los recursos empleados.
    */
   private void destroyDB() {
       try {
           //Se cierran todas las sentencias
           guardarStmt.close();           
           identificarStmt.close();
           //Cierra la conexión a la  base
           dbConnection.close();
           
       } catch (Exception e) {
           e.printStackTrace();
       }        
   }

Las partes en rojo deben ser remplazadas por aquellas que correspondan a tu configuración del servidor MySQL. Una vez que tenemos la conexión a la base de datos debemos hacer que el programa se conecte al inicializar la clase procedimientos.Util, para ello debemos de agregar una llamada al método initDB() dentro del constructor de la misma para que al final quede de la siguiente manera:

public Util(PantallaPrincipal ui) {
       this.ui = ui;
       //Inicializa la conexión a la BD.
       initDB();
       
}

Antes de poder guardar la huella (o la información de la huella) en la base de datos debemos de extraer el llamado Template o plantilla de la huella que es una representación matemática de un mapa de la huella, es importante aclarar que no vamos a guardar la imagen de la huella sino este mapa a partir del cual se pueden comparar varias huellas o verificar a quién pertenece, existe la manera de guardar la imagen pero no se realizará dicho proceso en este tutorial debido a las siguiente razones:

  1. No es seguro tener la imagen de una huella capturada.
  2. Una imagen ocupa muchísimo más espacio en la base de datos, si se plantea utilizar para corroborar una considerable cantidad de huellas el proceso se vuelve inoperable.
  3. No es necesario tener la imagen de la huella para compararla con otra, basta con la plantilla que se extraerá.

Una vez aclarado el punto anterior procedamos a extraer la plantilla de la huella capturada agregando el método extract() a la clase procedimientos.Util de la manera siguiente:

   /**
    * Extrae la plantilla de la imagen de la huella actual.
    */  
   public void extract() {
       
       try {
           //Extrae la plantilla de la imagen. 
           template = fingerprintSDK.extract(fingerprint);
           //Muestra la plantilla en la imagen
           ui.showImage(GrFingerJava.getBiometricImage(template,fingerprint));            
       } catch (GrFingerJavaException e) {
           e.printStackTrace();
       }
       
   }

Ya que hemos creado el método extract() basta con mandarlo llamar desde el método onImageAcquired() para que este último quede de la siguiente manera:

public void onImageAcquired(String idSensor, FingerprintImage huellaDigital) {
        //Almacena la imagen de la huella
       this.fingerprint=huellaDigital;

       //Muestra la imagen obtenida
       ui.showImage(huellaDigital);       
       
       //Muestra la plantilla en la imagen actual
       extract();
}

Una vez hecho lo anterior podemos correr el programa y capturar una huella, notaremos que se dibujan algunas líneas verdes sobre la misma, dichas líneas son la representación de la plantilla que hemos extraído.

Ahora viene la parte donde guardamos la plantilla de la huella en la base de datos. Lo primero que hacemos es agregar el método guardarHuella() procedimientos.Util de tal forma que quede de la siguiente manera:

   /*
    * Guarda los datos de la huella digital actual en la base de datos  
    */
   public void guardarHuella(){

                //Obtiene los datos del template de la huella actual
           fingerprintData = new ByteArrayInputStream(template.getData());
           fingerprintDataLength = template.getData().length;
           
                //Pregunta el nombre de la persona a la cual corresponde dicha huella
           String nombre = JOptionPane.showInputDialog("Nombre:");
           
        try {
                //Establece los valores para la sentencia SQL
            guardarStmt.setString(1,"default");
            guardarStmt.setString(2,nombre);
            guardarStmt.setBinaryStream(3, fingerprintData, fingerprintDataLength);
            //Ejecuta la sentencia
            guardarStmt.execute();

        } catch (SQLException ex) {
                //Si ocurre un error lo indica en la consola
            System.err.println("Error al guardar los datos de la huella.");
            ex.printStackTrace();
        }
   }

Tras realizar lo anterior debemos de realizar import correspondiente a la clase JOptionPane: import javax.swing.JOptionPane

Lo único que resta por hacer es mandar llamar el método guardarHuella() por medio del botón Guardar que aparece en la pantalla principal, para ello nos situamos en la pantalla principal y damos doble clic sobre el botón Guardar lo cual automáticamente nos crea el método que se efectúa al presionar el botón, ahora solo basta mandar llamar el método de la siguiente manera:

private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {                                           
    procedimientosSDK.guardarHuella();
}   

Tras realizar lo anterior, al ejecutar el programa, capturar una huella y presionar el botón Guardar podremos almacenar los datos de la huella digital en la base de datos y, posteriormente, podremos realizar operaciones de comparación y verificación de identidades, pero esto lo dejaremos para la siguiente entrega.

¿Alguna duda o algo qué decir? Deja tu comentario. Saludox.

****Actualización (08/08/2012)****
A petición de todos les dejo la lista de todos los artículos de este tutorial.

36 comentarios:

  1. roberto dijo...:

    buenas tades, me ha funcionado hasta donde me pide el nombre de la plantilla extraida de la huella, pero no me guarda nada en la base de datos...estoy usando xampp..agradeceria mucho la yuda

  1. JaaR8 dijo...:

    ke tal yo de nuevo, ya corre bien solo que el guardar la huella genera una exception de q es un desbordamiento me imagino q es el tmanño del buffer no no se a ke se deba aki te pongo el error espero me puedas a yudar gracias.

    Esta es la exception q me arroja:

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
    at com.mysql.jdbc.PreparedStatement.setBinaryStream(PreparedStatement.java:2776)

  1. Monillo007 dijo...:

    Qué tal,

    El error que te aparece es por que estás utilizando un arreglo y en algún momento estás tratando de acceder a una posición que está fuera del rango del mismo, es decir, si tu arreglo tiene un tamaño de 2 e intentas acceder a la posición 3, te va a dar esta excepcion.

    Saludox.

  1. Alexzm1 dijo...:

    Buenas noches, una pregunta
    Porqué donde haces el INSERT
    "INSERT INTO somhue(id, huenombre, huehuella) values(?,?,?)"

    escribes en values los signos de interrogación???
    oO
    Gracias =D

  1. Anónimo dijo...:

    HOLA BUENAS TARDES TENGO UN PROBLEMA AL HORA DE GUARDAR LA HUELLA ME MANDA UN ERROR
    java.sql.SQLException: Incorrect integer value: 'default' for column 'id' at row 1
    Y YA ESTAD RE VISANDO TODO Y NO SE POR QUE ME MARKA ESTO NO SE SI TENGA ALGO QUE VER KON LO DE LOS VALUES (?,?,?)
    AGRADECERIA ME CONTESTARAS

  1. GabyGlam dijo...:

    me funciono muy bien gracias por lo detallado del codigo

  1. Anónimo dijo...:

    Cordial saludo...

    al ejecutar el programa luego de haber terminado la parte 2 este me ejecuta sin errores pero no me captura la huella o por lo menos no me la muestra.

    ademas mi lector de huella siempre esta encendido... asi el programa no se este ejecutando...

  1. Anónimo dijo...:

    disculpa que te moleste pero podrias publicar el link para descargar el paquete de la huella digital en java

  1. irving dijo...:

    Hola, oye disculpa todo me funciona bien, pero al guardar en la base de datos no me guarda nada. Estoy utilizando xampp, agradecería mucho que me ayudaras

  1. Luis Navarro dijo...:

    Qué tal,

    Te aparece algún mensaje de error? Recuerda que el id de la tabla debe ser autoincrementable...

    Saludox

  1. Anónimo dijo...:

    Hola Luis,

    Me interese bastante en su articulo para la programación en Netbeans de un lector de huellas con motor de bases MySQL y he tratado de implementarlo, pero he topado con un error que aún no podido descifrar y sería de mucha ayuda su opinión.

    El error es básicamente este:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at procedimientos.Util.guardarHuella(Util.java:203)

    esta linea es la:

    guardarStmt.setString(1,"default");

    en donde voy agregando los valores para luego realizar el INSERT!, algo pasa con el atributo :

    private PreparedStatement guardarStmt;

    Espero que pueda colaborarme pues estoy sumamente interesado en el desarrollo completo de la aplicación.

    De antemano muchas gracias y si es posible estaremos en contacto...

    Nicolas Gutiérrez G.

  1. Juan Pablo dijo...:

    Hola Morillo,

    felicitaciones por el tutorial.

    me llamo JuanPablo, estuve probando paso a paso tu aplicacion,yo utlizo netbeans 7.0.1 con dispositivo secugen hamster plus y el Fingerprint SDK 2009(compre la licencia), me va bien, corre le programa, ingreso y veo la huella digital pero cuando quiero guardar la imagen me arroja este error:

    init:
    Deleting: C:\Users\PABLO\Documents\EjemploLectorHuellas\build\built-jar.properties
    deps-jar:
    Updating property file: C:\Users\PABLO\Documents\EjemploLectorHuellas\build\built-jar.properties
    compile:
    run:
    Error al guardar los datos de la huella.
    java.sql.SQLException: Incorrect integer value: 'default' for column 'id' at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1364)
    .
    .
    .

    Estuve leyendo post de usuarios pasados, y pensaba que tambien era algun error por bases de datos como, activar el autoincrement. probe tambien agregando campos en 'duro' a la base de datos. pero no me ha dado resultado . Tengo dias con esto y quisisera pidirte tu apoyo. porsiacso te dejo mi correo jpablo.sg@hotmail.com

    saludos y exitos

  1. Luis Navarro dijo...:

    Qué tal Juan Pablo,

    Intenta cambiar la línea guardarStmt.setString(1,"default"); por guardarStmt.setInt(1,1); para verificar que no haya problemas en la sentencia sql, de igual manera te recomiendo que descargues el proyecto terminado para que lo pruebes y me comentes si te sucede lo mismo. La liga para descargarlo puedes encontrarla en la parte 5 del tutorial.

    Saludos.

  1. Juan Pablo dijo...:

    Hola Morillo,

    gracias por responder

    realize lo que me dijistes y si me llego a funcionar. gracias!

    Pero ahora me e visto en la tarea de poder ejecutarlo por web. entonces para esto se me ocurrio 2 ideas: crear un jar. ejecutable y crear un servlet( java o php) que invoque al jar. y luego me retorne los bytes de la imagen para dibujarlo, pero como no se mucho manejo de servlet(java) lo deje de lado y opte por crear un applet(tambien soy novato en applet, lei que sugieren en post anteriores) pero si es cierto que el ejemplo sirve de guia para hacer uno en applet, son casos diferentes por ejemplo el JFrame tiene el evento formWindowActivated cosa que el JApplet no existe. otro caso es que en tu ejemplo tienes un main donde invocas el constructor del JFrame y luego llamas a una funcion inicializar().... pero en JApplet no existe un main solo he visto que hay un metodo 'run'.

    a pesar de estas dudas me aventure a crear el proyecto del applet y me arrojo este error.

    run:
    Exception in thread "Thread-5" java.lang.UnsupportedOperationException: Not supported yet.
    at procedimientos.Util.onFingerUp(Util.java:94)
    at com.griaule.grfingerjava.GrFingerJavaNative.callbackFinger(GrFingerJavaNative.java:180)

    espero me puedas dar una mano con este tema.
    Juan Pablo

  1. Luis Navarro dijo...:

    Qué tal,

    Verifica que en la línea 94 de Util.java no estés mandando manualmente la excepción.

    Saludos.

  1. Gabriel dijo...:

    Oye amigo, gracias por el tutorial, es de mucha ayuda, mi duda es que cuando corro mi programa no me muestra la captura de la huella, como en el tutorial 2, me dici que se ha producido un error y me cierra el programa, falta archivo:
    ystem.IO.FileNotFoundException: Could not load file or assembly 'GriauleFingerprintLibrary, Version=1.1.0.2, Culture=neutral, PublicKeyToken=0cd8a94f71f97144' or one of its dependencies. El sistema no puede hallar el archivo especificado.
    File name: 'GriauleFingerprintLibrary, Version=1.1.0.2, Culture=neutral, PublicKeyToken=0cd8a94f71f97144'

  1. Luis Navarro dijo...:

    Qué tal,

    ¿Qué versión del SDK estás utilizando?

  1. Gabriel dijo...:

    Fingerprint SDK Java 2009, el de la version trial

  1. Luis Navarro dijo...:

    Te recomiendo utilizar el que se indica en este tutorial que es la versión 2007, puedes descargarlo desde aquí:
    http://min.us/mvfrHo#1o

    Saludos.

  1. Anónimo dijo...:

    Hola que tal.

    en esta parte se queda asi o hay que agregar un directorio????

    String grFingerNativeDirectory = new File(".").getAbsolutePath(; Util.setFingerprintSDKNativeDirectory(grFingerNativeDirectory);

    y no me esta reconociendo las capturas de la huellas...

    Saludos..

  1. Luis Navarro dijo...:

    Qué tal,
    La línea va así como la indicas (terminando en ();), te aparece algún error al momento de capturar la huella?

    ¿Qué versión del SDK y modelo de lector estás utilizando?

  1. Anónimo dijo...:

    La FingerPrint SDK 2007 y el lector es digitalpersona u 4500, de igual forma corro los ejemplos del SDK y no me reconoce las capturas de lahuella, ademas tengo los .dll en system32 y no se que esta pasando.

  1. Luis Navarro dijo...:

    Entiendo,

    Este SDK tiene problemas en ocasiones con ese modelo de lector, me parece que el compatible sería el SDK 2009, sin embargo, el código del tutorial no se adapta completamente a esta última versión por lo que tienes 2 opciones:

    1) Utilizar un lector compatible con el SDK 2007
    2) Ajustar el código del SDK 2009 para que realice las funciones

    Pronto publicaré un tutorial para la versión 2009, de momento, tus opciones son las anteriores. Saludos.

  1. Anónimo dijo...:

    Hola buenos dias.

    temgo el siguiente problema con mi aplicacion,
    mi problema es en el momento de estraer el template de la huella para guardarlo, me sale la siguiente excepcion:

    Exception in thread "Thread-4" java.lang.UnsatisfiedLinkError: com.griaule.grfingerjava.GrFingerJavaNative.GrExtract([BIII[B[III)I
    at com.griaule.grfingerjava.GrFingerJavaNative.GrExtract(Native Method)
    at com.griaule.grfingerjava.MatchingContext.extract(MatchingContext.java:196)
    at com.griaule.grfingerjava.MatchingContext.extract(MatchingContext.java:171)
    at com.griaule.fingerprintsdk.sample.Util.extract(Util.java:601)
    at com.griaule.fingerprintsdk.sample.Util.onImageAcquired(Util.java:194)
    at com.griaule.grfingerjava.GrFingerJavaNative.callbackImage(GrFingerJavaNative.java:157)

    espero que me puedas ayudar....

  1. Luis Navarro dijo...:

    Qué tal,

    Verifica que todos los dll's se encuentren en el directorio correcto (lee nuevamente la parte 1 del tutorial para ver la configuración).

    Si el problema sigue ayudaría que me indicaras qué sistema operativo tienes, qué versión del SDK estás utilizando y cuál es el modelo del lector.

    Saludos.

  1. Anónimo dijo...:

    ya reconoce el lector, pero no prende, no se activa. asi no puedo realizar capturas....

  1. Luis Navarro dijo...:

    Qué tal,

    - ¿Qué sistema operativo tienes?
    - ¿Qué versión del SDK estás utilizando?
    - ¿Qué modelo de lector utilizas?

    Saludos.

  1. Anónimo dijo...:

    SO XP, FingerPrint SDK 2009 y el lector es digitalPersona u4500, anteriormente si funcionaba el ejemplo del SDK, captura y muestra todo bien, pero al reiniciar mi pc ya no prendio el lector.

  1. Luis Navarro dijo...:

    Qué tal,

    Te comento que el tutorial está orientado al SDK 2007, en este caso no tengo las bases para tratar de identificar la raíz de tu problema dado que utilizas el 2009, te recomiendo que te des una vuelta por la página de soporte de Griaule y verifiques si hay soluciones a problemas como el que presenta tu app.

    Lamento no poder ayudarte más allá. Saludos.

  1. Anónimo dijo...:

    Hola Luis me encuentro trabajando e la aplicacion de huella con java 6.9.1
    y SDK 2007 Windows XP y 7 y al ejecutar el formulario me envia el siguiente error y ya revise hice los pasos como se indican te agradezco en lo que me puedas colaborar el lector es Marca Microsoft.



    Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: com.griaule.grfingerjava.GrFingerJavaNative.GrInitialize()I
    at com.griaule.grfingerjava.GrFingerJavaNative.GrInitialize(Native Method)
    at com.griaule.grfingerjava.MatchingContext.createContext(MatchingContext.java:58)
    at com.griaule.grfingerjava.MatchingContext.(MatchingContext.java:103)
    at procedimientos.Util.inicializarCaptura(Util.java:131)
    at interfaz.PantallaPrincipal.(PantallaPrincipal.java:50)
    at interfaz.Menu.jMenuItem1ActionPerformed(Menu.java:131)
    at interfaz.Menu.access$000(Menu.java:20)
    at interfaz.Menu$1.actionPerformed(Menu.java:53)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
    at java.awt.Component.processMouseEvent(Component.java:6289)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6054)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4652)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:603)
    at java.awt.EventQueue$1.run(EventQueue.java:601)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:617)
    at java.awt.EventQueue$2.run(EventQueue.java:615)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

  1. Luis Navarro dijo...:

    Qué tal,

    Al parecer es un problema con las dll's, verifica que lo indicado en la parte 1 del tutorial esté realizado al 100%.

    Saludos.

  1. Anónimo dijo...:

    Hola Luis me podrias indicar si el SDK 2007 es compatible con este lector Huellero marca Futronic, modelo F580


    Gracias

  1. Anónimo dijo...:

    Gracias Luis ya consegui la compatibilidad de lectores con SDK 2007 mando el link quizas sea util a alguien

    http://www.biometriaaplicada.com/Griaule-pdf/Fingerprint-SDK.pdf

  1. Anónimo dijo...:

    SOLUCIÓN AL SIGUIENTE ERROR: java.sql.SQLException: Incorrect integer value: 'default' for column 'id' at row 1
    HACER LO SIGUIENTE:
    1.- CAMBIAR LA LINEA guardarStmt.setString(1,"default"); POR guardarStmt.setInt(1,0);

    LISTO!! YA TE DEBE FUNCIONAR.

  1. Anónimo dijo...:

    ...ahh olvidaba mencionar en el anterior comentario que el campo id de la tabla del proyecto debe ser int not null auto_increment

  1. rickymax dijo...:

    Estimado, por favor ayudenos publicando nuevamente la libreria de FingerPrint SDK 2007 pues el link que usted publica no permite descargar el archivo nos sera de gran ayuda para todos.

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes