Download Ejemplo de excepciones en jarra de bases de datos package Uv

Document related concepts
no text concepts found
Transcript
Ejemplo de excepciones en jarra de bases de datos
package Uv;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConexiónS {
/*
* Esta clase es parte de un ejemplo de uso de bases de datos en Java
* Autor: Juan Manuel Fernández Peña
* Fecha: octubre de 2010
* Se buscó usar un patrón Singleton para evitar conflictos en acceso a BD
* Historia:
*
versión 1.1: se aprovechó experiencia en conexionSSQL y otras
*/
private static Connection conexion;
private static String quemanejador, queurl, queclave, quepass;
private static ConexiónS unica=new ConexiónS();
private static Statement sta;
private static String ultfalla=" ";
private final String versión = "Versión 1.1 10/2010";
private ConexiónS(){
// Constructor interno para evitar duplicidades
}
/*
* Parte interna. Note que la conexión física se maneja de modo privado, para evitar dobles aperturas
*/
private static boolean Conecta(){
// Conexión física a la base de datos
boolean resp=false;
if (conexion == null)
try{
Class.forName(quemanejador).newInstance();
conexion = DriverManager.getConnection(queurl,queclave,quepass);
resp=true;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
System.out.println("Falla al crear conexión. "+e);
e.printStackTrace();
ultfalla="Falla al crear conexión. "+e;
}
catch (IllegalAccessException e) {
// TODO Auto-generated catch block
System.out.println("No deja acceder a la bd: "+queurl+". "+e);
e.printStackTrace();
ultfalla="No deja acceder a la bd: "+queurl+". "+e;
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("No reconoce el manejador: "+quemanejador+". "+e);
e.printStackTrace();
ultfalla="No reconoce el manejador: "+quemanejador+". "+e;
}
catch(SQLException ex1){
System.out.println("Mensaje: "+ex1.getMessage());
System.out.println("Estado: "+ex1.getSQLState());
System.out.println("Codigo de Error: "+ex1.getErrorCode());
}
return resp;
}
private static boolean prepara(String manejador, String url,String clave, String pass){
// Método intermediario para dar acceso al público
// Manejador: cualquiera tipo sql
// Url: asociado al manejador, podría ser ODBC
// Clave y password si lo pide el manejador; Derby no las usa
boolean ret = false;
if (conexion == null){
quemanejador=manejador; queurl=url; queclave=clave; quepass=pass;
ret = Conecta();
}else{ret=true;}
return ret;
}
public static String getUltfalla(){
return ultfalla;
}
/*
* Para crear una instancia del objeto de tipo ConexiónS
*/
public static ConexiónS getConexiónS(){
// Al ser estática, es la forma de obtener un acceso a la conexión, sin duplicar
return unica;
}
/*
* Aquí comienza la API que se ofrece al público
*/
//crear base de datos y conectarse
public static boolean creabd(String manejador, String url, String basedat,String clave, String pass){
boolean resp=false;
//Note la parte que indica crear: create=true
resp=prepara(manejador,url+basedat+";create=true",clave,pass);
return resp;
}
//abrir base de datos ya existente
public static boolean abrirbd(String manejador, String url, String basedat,String clave, String pass){
boolean resp=false;
resp=prepara(manejador,url+basedat,clave,pass);
return resp;
}
//abrir base de datos ya existente sin clave y password
public static boolean abrirbd(String manejador, String url, String basedat){
boolean resp=false;
resp=prepara(manejador,url+basedat,"","");
return resp;
}
//Crear una tabla
public void creaTabla(String ta) throws ExcepciónBD {
// ta debe contener el nombre de la tabla y la definición de las columnas
//ResultSet r = null;
if (conexion==null)
throw new ExcepciónBD("No hay conexión activa.");
else
try {
sta = conexion.createStatement();
//System.out.println("Creamos statement");
sta.execute("CREATE TABLE " + ta);
} catch (SQLException se) {
System.out.println("Problema con la creación de tabla. " + ta
+ "| " + se);
}
}
//lectura de datos con un select estándar sólo lectura
public ResultSet getDatos(String que) throws ExcepciónBD{
//sólo usable para consultas
//el parámetro que contiene un query en SQL
//Antes abrebd(manejador,url+basedat,clave,pass);
ResultSet r = null;
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
r = sta.executeQuery(que);
//System.out.println("Se ejecutó query:"+que);
} catch (SQLException se) {
System.out.println("Problema con la query. " + que + "| " + se);
}
}
return r;
}
//lectura de datos actualizables
public ResultSet ensalDatos(String que) throws ExcepciónBD{
//sólo usable para consultas
//el parámetro que contiene un query en SQL
//Antes abrebd(manejador,url+basedat,clave,pass);
System.out.println("Conexion Ensal recibe query: "+que+"|");
ResultSet r = null;
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
System.out.println("Conexion Ensal creo statement");
r = sta.executeQuery(que);
//System.out.println("Se ejecutó query:"+que);
} catch (SQLException se) {
System.out.println("Problema con la query. " + que + "| " + se);
}
}
return r;
}
//inserción de datos
public void insertaDatos(String ta, String va)throws ExcepciónBD {
// ta indica la tabla donde se insertará
// va los valores a insertar, suponiendo que es todo el registro
// antes debe hacer abredb
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
sta.execute("INSERT INTO "+ta+" VALUES "+va);
//sta.execute("INSERT INTO "+ta+" "+cab+" VALUES "+va);
//System.out.println("Se ejecutó insert:"+ta+" "+cab+" VALUES "+va);
//System.out.println("Se ejecutó insert:"+ta+" VALUES "+va);
} catch (SQLException se) {
System.out.println("Problema con la inserción. INSERT INTO " + ta+" VALUES "+va + "| " + se);
}
}
}
//actualización de datos
public int actualizaDatos(String ta, String va)throws ExcepciónBD {
int regact=0;
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
regact=sta.executeUpdate("UPDATE "+ta+" SET "+va);
//System.out.println("Se ejecutó insert:"+ta+" "+va);
} catch (SQLException se) {
System.out.println("Problema con la actualización. " + ta+" "+va + "| " + se);
}
}
return regact;
}
//eliminación de datos
public int eliminaDatos(String ta, String va)throws ExcepciónBD {
int regact=0;
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
regact=sta.executeUpdate("DELETE FROM "+ta+" "+va);
//System.out.println("Se ejecutó delete:"+ta+" "+va);
} catch (SQLException se) {
System.out.println("Problema con la eliminación. " + ta+" "+va + "| " + se);
}
}
return regact;
}
// Terminar la conexión, cerrando la base de datos
public void cierra() {
if (conexion != null)
try {
conexion.commit();
conexion.close();
} catch (SQLException se) {
System.out.println("Falla al cerrar. " + se);
}finally {boolean edo=(conexion==null);
System.out.println("Despues de cerrar: conexion nula: "+edo);
}
conexion = null;
}
// Aplicación de una query arbitraria
public boolean aplicaQuery(String que){
boolean res=false;
ResultSet r = null;
if (conexion==null) throw new ExcepciónBD("Aún no existe conexión.");
else {
try {
sta = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
r=sta.executeQuery(que);
res=true;
//System.out.println("Se ejecutó query"+que);
} catch (SQLException se) {
System.out.println("Problema con la acción. " + que + "| " + se);
}
}
return res;
}
// Uso local para conocer la versión
public String getVersión(){
return versión;
}
// Obtiene metadatos de una tabla
public DatabaseMetaData dameMetadatos(){
DatabaseMetaData dbmd=null;
try{
dbmd=conexion.getMetaData();
}catch (SQLException ex) {
System.out.println("Problema al traeer metadatos");
}
return dbmd;
}
}
package Uv;
public class ExcepciónBD extends RuntimeException {
//Auxiliar para manejo de bases de datos
// JM Fernández, 2009
public ExcepciónBD(String mens){
super(mens);
}
}
package Uv;
import java.beans.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
/*
* Clase que representa los elementos Control y Modelo de datos para
* el manejo de tablas en conexión a una interfaz (parte "Vista")
* Supone que se le pasa una conexión en forma de referencia a ConexiónS
* y también una consulta de SQL
* El modelo se pasa a un JTable, que le pasa avisos cuando se acciona sobre la vista
*/
public class ModeloConsulta extends AbstractTableModel {
// Parte transitoria del modelo de datos
// (la parte persistente es la base de datos que se abre)
Vector cache;
private int colCount;
String[] headers;
private Statement statement;
private ConexiónS kone = null;
private ResultSet rs;
ResultSetMetaData meta;
private static final String versión = "1.1";
// Los métodos que dicen override deben sobreescribirse obligatoriamente
// Otros son opcionales.
@Override
public int getColumnCount() {
return colCount;
}
@Override
public int getRowCount() {
return cache.size();
}
@Override
public Object getValueAt(int row, int col) {
return ((String[])cache.elementAt(row))[col];
}
// Para obtener los encabezados
public String getColumnName(int i) {
return headers[i];
}
// Para permitir edición de todas las celdas.
// se puede limitar a ciertas filas y columnas
public boolean isCellEditable(int fila, int col){
return true;
}
// Actualiza el modelo de datos
public void setValueAt(Object algo, int fila, int col){
System.out.println("Se pidió actualizar ("+fila+","+col+") con "+algo);
try{
String []temp = (String[])cache.elementAt(fila);
temp[col] = (String) algo;
cache.setElementAt(temp, fila);
rs.absolute(fila+1);
rs.updateString(col+1,(String) algo);
rs.updateRow();
//this.fireTableCellUpdated(fila+1, col+1);
}catch (SQLException se){
System.err.println("Problema al actualizar ("+fila+","+col+") con "+algo+"| "+se);
}
}
// Constructor (muy simple)
public ModeloConsulta(){
// la conexión se establece en la interfaz, pero se puede cambiar
//System.out.println("construyendo modelo");
cache = new Vector();
}
// Le pasa la conexión
public void setKone(ConexiónS con){
kone = con;
}
// Parte principal: recibe una consulta
public void cargaConsulta(String consu){
//System.out.println("Se traerán datos");
cache = new Vector();
try {
// Execute the query and store the result set and its metadata
rs = kone.ensalDatos(consu);
meta = rs.getMetaData();
colCount = meta.getColumnCount();
// Now we must rebuild the headers array with the new column names
headers = new String[colCount];
for (int h=1; h <= colCount; h++) {
headers[h-1] = meta.getColumnName(h);
//System.out.println("Col "+h+" llamada "+meta.getColumnName(h));
}
// El uso de cache para los registros se limita a cantidades pequeñas de registros
// No es bueno para grandes volúmenes
// También está hecho para datos genéricos, puede necesitarse algo mejor
while (rs.next()) {
String[] record = new String[colCount];
for (int i=0; i < colCount; i++) {
record[i] = rs.getString(i + 1);
}
cache.addElement(record);
}
fireTableChanged(null); // notify everyone that we have a new table.
}
catch(Exception e) {
cache = new Vector(); // blank it out and keep going.
System.err.println("Problema al ejecutar la consulta:"+consu+"|");
JOptionPane.showMessageDialog(null,"No pudo cargarse la consulta pedida");
e.printStackTrace();
}
System.out.println("Se hallaron registros= "+colCount);
}
// Agrega registros; es invocada por la JTable
public void addRow(int ref){
String[] s= new String[colCount];
int kua = getRowCount();
//System.out.println("se inserta con ref= "+ref);
cache.addElement(s);
try{
rs.moveToInsertRow();
//System.out.println("Posicionado");
rs.insertRow();
fireTableRowsInserted(kua,kua+1);
}catch (SQLException se){
System.out.println("No se pudo agregar elemento. "+se);
}
}
// Elimina un registro
public void deleteRow(int ref){
//System.out.println("Eliminando reg "+ref+" Hay ahora "+getRowCount());
cache.remove(ref);
try{
rs.absolute(ref+1);
rs.deleteRow();
//System.out.println("Registro eliminado"+ref+" Hay ahora "+getRowCount());
fireTableRowsInserted(ref,ref);
}catch (SQLException se){
System.out.println("No se pudo eliminar elemento. "+se);
}
}
public void cierra(){
cache = new Vector();
fireTableChanged(null); // notify everyone that we have a new table.
}
}