You are on page 1of 27

El primero artculo fue publicado exactamente el 20 de Febrero de 2012, en este mismo blog y su

URL es la siguiente: https://napster2011.wordpress.com/2012/02/20/lector-de-huella-digital-en-


java/

Despus de publicar esta nueva entrega de la programacin de un lector de huella digital con JAVA
y mySQL.

Sin ms prembulos, procedo a explicar el proceso:

Para el desarrollo del proyecto, utilic el IDE para programar en Java de Oracle, llamado NetBeans
7.1

Como pueden observar, nuestro proyecto se llama Lector de Huellas y consta de tres clases, y cada
una de stas (las clases) tiene su respectiva funcin dentro del proyecto:

Clase Interfaz

Esta clase contiene el archivo PantallaPrincipal.java y es quien se encarga de disear la interfaz


principal de nuestro sistema de autenticacin por huella digital.

Diseo de la pantalla principal de nuestro sistema

El contenido del archivo PantallaPrincipal.java es el siguiente:

/**

* @package: interfaz

* @class: PantallaPrincipal
* @author: Ricardo Rosero

* @version: 1.0

*/

package interfaz;

/**

* @librerias importadas

* @author: Ricardo Rosero

*/

import com.griaule.grfingerjava.GrFingerJavaException;

import java.awt.Graphics;

import java.awt.Insets;

import java.awt.image.BufferedImage;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.JComponent;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.UIManager;

import javax.swing.border.BevelBorder;

import javax.swing.border.CompoundBorder;

import javax.swing.border.EmptyBorder;

import procedimientos.Util;

public class PantallaPrincipal extends javax.swing.JFrame {

/**

* @atributos

* @author: Ricardo Rosero

* @access: private
*/

//objecto usado para realizar todas las operaciones relacionadas al Fingerprint-SDK

private Util procedimientosSDK;

//Panel para mostrar la huella digital

private JPanel fingerprintViewPanel = null;

//Imagen de la huella actual

private BufferedImage fingerprintImage = null;

/**

* @function: PantallaPrincipal

* @author: Ricardo Rosero

* @access: public

* @return

*/

public PantallaPrincipal() {

inicializar();

initComponents();

procedimientosSDK.inicializarCaptura();

setLocationRelativeTo(null);

setVisible(true);

/**

* @function: inicializar

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void inicializar() {


try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

catch (Exception e) {

System.err.println(No se pudo aplicar el estilo visual);

//Crea una instancia de Util

this.procedimientosSDK = new Util(this);

/**

* @function: crearPanelHuella

* @author: Ricardo Rosero

* @access: private

* @return

*/

private JComponent crearPanelHuella() {

//Crea un panel nuevo para mostrar la huella

fingerprintViewPanel = new JPanel(){

//Se sobreescribe el mtodo paintComponent para habilitar la muestra de la imagen de la huella

public void paintComponent(Graphics g) {

super.paintComponent(g);

//Si hay una imagen para ser mostrada

if (fingerprintImage!=null) {

//Calcula el tamao y posicin de la imagen para ser pintada el tamao es ajustado para que
ocupe todo el tamao del panel

Insets insets = getInsets();

int transX = insets.left;

int transY = insets.top;


int width = getWidth() getInsets().right getInsets().left;

int height = getHeight() getInsets().bottom getInsets().top;

//Se dibuja la imagen

g.drawImage(fingerprintImage, transX, transY, width, height, null);

};

//Se agrega un border alrededor del panel

fingerprintViewPanel.setBorder(new CompoundBorder (

new EmptyBorder (2,2,2,2),

new BevelBorder(BevelBorder.LOWERED)));

fingerprintViewPanel.setToolTipText(Imagen de la ltima huella capturada.);

if(fingerprintViewPanel==null){

System.exit(1);

return null;

else{

return fingerprintViewPanel;

/**

* @function: showImage

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void showImage(BufferedImage image) {

//Utiliza el imageProducer para crear una imagen de la huella digital


fingerprintImage = image;

//Se dibuja la nueva imagen

repaint();

/**

* @function: initComponents

* @author: Ricardo Rosero

* @access: private

* @return

*/

@SuppressWarnings(unchecked)

// <editor-fold defaultstate=collapsed desc=Generated Code>

private void initComponents() {

jPanel2 = new javax.swing.JPanel();

btnIdentificar = new javax.swing.JButton();

btnGuardar = new javax.swing.JButton();

btnSalir = new javax.swing.JButton();

PanelContenedor = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setResizable(false);

addWindowListener(new java.awt.event.WindowAdapter() {

public void windowActivated(java.awt.event.WindowEvent evt) {

formWindowActivated(evt);

public void windowClosing(java.awt.event.WindowEvent evt) {

formWindowClosing(evt);
}

});

jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(new
javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED), Acciones,
javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));

btnIdentificar.setText(Identificar);

btnIdentificar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

btnIdentificarActionPerformed(evt);

});

btnGuardar.setText(Guardar);

btnGuardar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

btnGuardarActionPerformed(evt);

});

btnSalir.setText(Salir);

btnSalir.setAlignmentY(0.0F);

btnSalir.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

btnSalirActionPerformed(evt);

});

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);


jPanel2.setLayout(jPanel2Layout);

jPanel2Layout.setHorizontalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 124,


javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 124,


javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap())

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()

.addGap(0, 0, Short.MAX_VALUE)

.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 124,


javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(100, 100, 100))))

);

jPanel2Layout.setVerticalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 35,


javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 35,


javax.swing.GroupLayout.PREFERRED_SIZE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 35,
javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PanelContenedor.setBorder(javax.swing.BorderFactory.createTitledBorder(null, Huella Digital,


javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));

PanelContenedor.setLayout(new java.awt.BorderLayout());

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addGap(0, 0, Short.MAX_VALUE)

.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 364,


javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(10, 10, 10)

.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 353,


javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

PanelContenedor.getAccessibleContext().setAccessibleParent(jPanel2);

pack();

}// </editor-fold>

/**

* @function: btnGuardarActionPerformed

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {

try {

//procedimientosSDK.guardarHuella();

//procedimientosSDK.guardarHuellaBackup();

procedimientosSDK.guardar();

} catch (GrFingerJavaException ex) {

Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);

/**

* @function: btnSalirActionPerformed

* @author: Ricardo Rosero

* @access: private

* @return

*/
private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {

dispose();

/**

* @function: formWindowActivated

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void formWindowActivated(java.awt.event.WindowEvent evt) {

this.PanelContenedor.add(this.crearPanelHuella());

/**

* @function: formWindowClosing

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void formWindowClosing(java.awt.event.WindowEvent evt) {

/**

* @function: btnIdentificarActionPerformed

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void btnIdentificarActionPerformed(java.awt.event.ActionEvent evt) {


try {

procedimientosSDK.identificarPersona();

} catch (GrFingerJavaException ex) {

Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);

/**

* @atributos

* @author: Ricardo Rosero

* @access: private

*/

// Variables declaration do not modify

private javax.swing.JPanel PanelContenedor;

private javax.swing.JButton btnGuardar;

private javax.swing.JButton btnIdentificar;

private javax.swing.JButton btnSalir;

private javax.swing.JPanel jPanel2;

// End of variables declaration

Clase Procedimientos

Esta clase contiene el archivo Util.java y su estructura es la siguiente:

/**

* @package: procedimientos

* @class: Util

* @author: Ricardo Rosero

* @version: 1.0
*/

package procedimientos;

/**

* @librerias importadas

* @author: Ricardo Rosero

*/

import com.griaule.grfingerjava.FingerprintImage;

import com.griaule.grfingerjava.GrFingerJava;

import com.griaule.grfingerjava.GrFingerJavaException;

import com.griaule.grfingerjava.IFingerEventListener;

import com.griaule.grfingerjava.IImageEventListener;

import com.griaule.grfingerjava.IStatusEventListener;

import com.griaule.grfingerjava.MatchingContext;

import com.griaule.grfingerjava.Template;

import com.mysql.jdbc.Blob;

import interfaz.PantallaPrincipal;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.JOptionPane;

import java.io.InputStream;

public class Util implements IStatusEventListener, IImageEventListener, IFingerEventListener{


/**

* @atributos

* @author: Ricardo Rosero

* @access: public y private

*/

/**Contexto utilizado para la captura, extraccin y coincidencia de huellas digitales */

private MatchingContext fingerprintSDK;

/**Interfaz de usuario donde se muestra la imagena de la huella*/

private PantallaPrincipal ui;

/** Indica si la plantilla o template debe ser extrada automticamente*/

private boolean autoExtract = true;

/** Arreglo que contiene localmente los datos de las huellas capturadas */

private ByteArrayInputStream fingerprintData, fingerprintData2;

/**Arreglo que contiene la longitud del dato de la huella*/

private int fingerprintDataLength, fingerprintDataLenght2;

/** La imagen de la ltima huella digital capturada. */

private FingerprintImage fingerprint, fingerprint2;

/** La plantilla de la ltima imagen de huella capturada */

public com.griaule.grfingerjava.Template template, template2;

/** La conexion con la base de datos */

private Connection dbConnection;

/** Consultas SQL */

private PreparedStatement guardarStmt, guardar2;

private PreparedStatement identificarStmt;

private PreparedStatement verificarStmt;

private PreparedStatement verificarDatosUsuario;

private PreparedStatement verificaCedulaUsuario;

private PreparedStatement verificaCedulaHuellaUsuario;

private PreparedStatement verficaHuellaUsuario;


/**

* @function: Util

* @author: Ricardo Rosero

* @access: public

* @return

*/

public Util(PantallaPrincipal ui) {

this.ui = ui;

//Inicializa la conexin a la BD.

initDB();

/**

* @function: inicializarCaptura

* @author: Ricardo Rosero

* @access: public

* @return:

*/

public void inicializarCaptura() {

try {

fingerprintSDK = new MatchingContext();

//Inicializa la captura de huella digital.

GrFingerJava.initializeCapture(this);

catch (Exception e) {

//Si ocurre un error durante la inicializacin se indica con un mensaje y se cierra la aplicacin.

e.printStackTrace();

System.exit(1);
}

/**

* @function: initDB

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void initDB() {

try {

//Carga el driver ODBC

Class.forName(com.mysql.jdbc.Driver);

//Se conecta a la bd

dbConnection = DriverManager.getConnection(jdbc:mysql://localhost:3306/huellas,root,
rrosero1980);

Statement stm = dbConnection.createStatement();

//Prepara las consultas/sentencias que se utilizarn

guardarStmt = dbConnection.prepareStatement(INSERT INTO huella(identificacion_usuario,


nombres_usuario, huella1_usuario, huella2_usuario) values(?,?,?,));

guardar2 = dbConnection.prepareStatement(update huella set huella2_usuario=? where


(identificacion_usuario=?));

identificarStmt = dbConnection.prepareStatement(SELECT nombres_usuario, huella1_usuario,


huella2_usuario FROM huella);

verificarStmt = dbConnection.prepareStatement(SELECT huella1 FROM huella WHERE


nombres_usuario=?);

verificarDatosUsuario = dbConnection.prepareStatement(select * from huella where


identificacion_usuario=?);

verificaCedulaUsuario = dbConnection.prepareStatement(select identificacion_usuario from


huella where (identificacion_usuario=?));

verificaCedulaHuellaUsuario = dbConnection.prepareStatement(select identificacion_usuario,


huella1_usuario from huella where (identificacion_usuario=?));
verficaHuellaUsuario = dbConnection.prepareStatement(selec * from huella where
(huella1_usuario=?));

catch (Exception e) {

e.printStackTrace();

/**

* @function: destroyDB

* @author: Ricardo Rosero

* @access: private

* @return

*/

private void destroyDB() {

try {

//Se cierran todas las sentencias

guardarStmt.close();

identificarStmt.close();

//Cierra la conexin a la base

dbConnection.close();

catch (Exception e) {

e.printStackTrace();

/**

* @function: setFingerprintSDKNativeDirectory
* @author: Ricardo Rosero

* @access: public

* @return

*/

public static void setFingerprintSDKNativeDirectory(String directorio) {

File directory = new File(directorio);

try {

GrFingerJava.setNativeLibrariesDirectory(directory);

GrFingerJava.setLicenseDirectory(directory);

catch (GrFingerJavaException e) {

e.printStackTrace();

/**

* @function: onSensorPlug

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void onSensorPlug(String idSensor) {

try {

//Comienza la captura con el lector conectado.

GrFingerJava.startCapture(idSensor, this, this);

catch (GrFingerJavaException e) {

//Indica si ha ocurrido un error con el lector.

e.printStackTrace();
}

/**

* @function: onSensorUnPlug

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void onSensorUnplug(String idSensor) {

try {

GrFingerJava.stopCapture(idSensor);

catch (GrFingerJavaException e) {

//Indica si ha ocurrido un error con el lector.

e.printStackTrace();

/**

* @function: onImageAcquired

* @author: Ricardo Rosero

* @access: public

* @return

*/

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();

/**

* @function: extrac

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void extract() {

try {

//Extracts a template from the current fingerprint image.

template = fingerprintSDK.extract(fingerprint);

//display minutiae/segments/directions into image

ui.showImage(GrFingerJava.getBiometricImage(template,fingerprint));

catch (GrFingerJavaException e) {

e.printStackTrace();

/**

* @function: guardar

* @author: Ricardo Rosero

* @access: public

* @return

* @throws: GrFingerJavaException
*/

public void guardar() throws GrFingerJavaException{

fingerprintData = new ByteArrayInputStream(template.getData());

fingerprintDataLength = template.getData().length;

String cedula = JOptionPane.showInputDialog(No. Identificacion:);

boolean coinciden = false;

try{

verificaCedulaHuellaUsuario.setInt(1, Integer.parseInt(cedula));

ResultSet rs = verificaCedulaHuellaUsuario.executeQuery();

//ResultSet rs2 = verficaHuellaUsuario.executeQuery();

//Si se encuentra el nombre en la base de datos

if(rs.next()){

//Lee la plantilla de la base de datos

byte templateBuffer[] = rs.getBytes(2); //.getBytes(2);

//Crea una nueva plantilla

Template referenceTemplate = new Template(templateBuffer);

//compara las plantilas (actual vs bd)

coinciden = fingerprintSDK.verify(template,referenceTemplate);

if(coinciden){

JOptionPane.showMessageDialog(null, La huella ya existe, coloque un dedo diferente);

else{

guardar2.setBinaryStream(1, fingerprintData, fingerprintDataLength);

guardar2.setInt(2, Integer.parseInt(cedula));

guardar2.execute();

JOptionPane.showMessageDialog(null, Ha guarado la huella de backup);

else if(!rs.next()){
String nombre = JOptionPane.showInputDialog(Nombre y Apellido:);

guardarStmt.setInt(1,Integer.parseInt(cedula));

guardarStmt.setString(2,nombre);

guardarStmt.setBinaryStream(3, fingerprintData, fingerprintDataLength);

guardarStmt.execute();

JOptionPane.showMessageDialog(null, La huella ha sido guardada con exito);

catch(SQLException sqlEx){

sqlEx.printStackTrace();

System.out.println(Se produjo el siguiente error: +sqlEx.getMessage());

/**

* @function: onFingerDown

* @author: Ricardo Rosero

* @access: public

* @return

*/

public void onFingerDown(String idSensor) {

/**

* @function: onFingerUp

* @author: Ricardo Rosero

* @access: public

* @return

*/
public void onFingerUp(String arg0) {

/**

* @function: onFingerUp

* @author: Ricardo Rosero

* @access: public

* @return

* @throws: GrFingerJavaException

*/

public void identificarPersona() throws GrFingerJavaException{

try{

//Obtiene todas las huellas de la bd

ResultSet rsIdentificar = identificarStmt.executeQuery();

//Si se encuentra el nombre en la base de datos

while(rsIdentificar.next()){

byte templateBuffer[] = rsIdentificar.getBytes(huella1_usuario);

Template referenceTemplate = new Template(templateBuffer);

if(referenceTemplate!=null){

//Lee la plantilla de la base de datos

boolean coinciden = fingerprintSDK.verify(template,referenceTemplate);

//Si encuentra correspondencia dibuja el mapa e indica el nombre de la persona que coincidi.

if (coinciden){

JOptionPane.showMessageDialog(null, Bienvenido
+rsIdentificar.getString(nombres_usuario));

return;

}
//Si no encuentra alguna huella que coincida lo indica con un mensaje

JOptionPane.showMessageDialog(null, No existe ningn registro que coincida con la huella.);

catch (SQLException e) {

System.out.println(Se produjo el siguiente error: +e.getMessage());

e.printStackTrace();

catch(GrFingerJavaException gr){

System.out.println(Error con el scanner: +gr.getMessage());

gr.printStackTrace();

Cabe recordar que esta clase es la ms importante de todas, debido a que en esta clase
procedemos a conectar nuestro sistema de autenticacion con el motor de bases de datos mySQL.

Clase LectorHuella

Esta clase es la ms sencilla de todas, y contiene el archivo Main.java , la funcin de esta clase es
simple, se encarga de ejecutar nuestro programa, y su estructura es la siguiente:

/**

* @package: lectorhuellas

* @class: Main

* @author: Ricardo Rosero

* @version: 1.0

*/

package lectorhuellas;
/**

* @librerias importadas

* @author: Ricardo Rosero

*/

import interfaz.PantallaPrincipal;

import java.io.File;

import procedimientos.Util;

public class Main {

/**

* @function: main

* @author: Ricardo Rosero

* @access: public

* @param: args argumentos de la funcion

* @return

*/

public static void main(String[] args) {

String grFingerNativeDirectory = new File(.).getAbsolutePath();

Util.setFingerprintSDKNativeDirectory(grFingerNativeDirectory);

PantallaPrincipal p = new PantallaPrincipal();

Como pueden observar en cada una de las clases importamos la librera


com.griaule.grfingerjava.*; , este paquete es pago, y hace parte del FingerprintSDK2009 de la
empresa Griaule Biometrics. Actualmente es el mejor SDK para la compilacin de sistemas de
autenticacion basados en huella digital, este paquete tiene la capacidad de comparar 35 mil
huellas por segundo.

La estructura de nuestra base de datos en mySQL es la siguiente:


Host: 127.0.0.1

Server version: 5.1.36-community MySQL Community Server (GPL)

Server OS: Win32

HeidiSQL version: 7.0.0.4053

Date/time: 2012-03-29 13:47:53

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET NAMES utf8 */;

/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

Dumping database structure for huellas

DROP DATABASE IF EXISTS `huellas`;

CREATE DATABASE IF NOT EXISTS `huellas` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `huellas`;

Dumping structure for table huellas.huella

DROP TABLE IF EXISTS `huella`;

CREATE TABLE IF NOT EXISTS `huella` (

`identificacion_usuario` bigint(20) unsigned NOT NULL,

`nombres_usuario` varchar(250) NOT NULL,

`huella1_usuario` blob NOT NULL,

`huella2_usuario` blob NOT NULL,

PRIMARY KEY (`identificacion_usuario`),

KEY `cedula` (`identificacion_usuario`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Data exporting was unselected.


/*!40014 SET FOREIGN_KEY_CHECKS=1 */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

You might also like