Error con conexion MAccess No se pueden abrir más tablas.

papitu769
16 de Abril del 2008
Hola,

Estoy intentado modificar una hoja excel utilizando la API JDOM. He conseguido poder modificarla sin problemas.

Pero cuando intento que al actualizarla acceda a una base de datos MS Access 2003 despues de hacer bastantes lecturas me da el siguiente error.

Error con conexion:java.sql.SQLException: [Microsoft][Controlador ODBC Microsoft Access] No se pueden abrir más tablas.

Mi hoja excel tiene unas 8000 lineas. Y por cada una de ellas debo acceder a la base de datos de 1 a 8 veces.

Tengo que decir que no se mucho de java. A base de leer por aqui y por alli he conseguido hacer una clase que aparentemente hace lo que quiero salvo el error anterior. He probado a cambiar de posicion en el bucle las instrucciones que generan el ResultSet pero no mejora.
statement = connection.createStatement();
statement.executeQuery(query);


Os pongo mi codigo por si alguno me puede ayudar. He tenido que cortar algo porque sino no entraba en el foro. Pero basicamente son los import y poco mas. Gracias.

public class Prueba {
public static void main(String[] args) {
boolean seguirProceso;
seguirProceso = true;
proceso:
while (seguirProceso) {

DatosGenerales dg = new DatosGenerales();
if (dg.existeDG == false){
break proceso;
}

SAXBuilder saxBuilder = new SAXBuilder();

// start parsing...
// command line should offer URIs or file names
try {
fichero = "prueba3.xml";
Document jdomDocument = saxBuilder.build(fichero);

Prueba prueba = new Prueba(jdomDocument, dg);

} catch (JDOMException e) { // indicates a well-formedness or other error
System.out.println(fichero + " is not a well formed XML document.");
System.out.println(e.getMessage());
} catch (IOException e) { // indicates an IO problem
System.out.println(fichero + " could not be parsed");
System.out.println(e.getMessage());
}
seguirProceso = false;
} // Fin del While que engloba el proceso.
} // fin de metodo main
// Variables de la clase
public Prueba(Document doc, DatosGenerales dg) {

final int lcodArticuloIndex = 2;
final int lpvpRecologicIndex = 6;
final int lpaginasIndex = 7;
final int lproveedorIndex = 8;
final int lmpIndex = 9;
final int lpvcpIndex = 10;
final int lpcdIndex = 11;

boolean proceso = true;
proceso:
while (proceso) {
OrdenReciclado or = new OrdenReciclado(dg);
if (or.existeOR == false){
System.out.println("No existe registro Orden Reciclado");
break proceso;
}

try {
Class.forName(dg.driver);
Connection connection = DriverManager.getConnection(dg.url, dg.username,
dg.password);

Rutinas rutinas= new Rutinas();

String query;
String[] lcamposSelect = new String[30];
int ics;
String lfrom;
String lwhere;
String lorder;
String linnerJoin;
String louterJoin;
String leftJoin;
String rightJoin;
String lon;

// Obtengo Element root
Element root = doc.getRootElement();

// List childrenWS = root.getChildren("Worksheet");
List childrenWS = root.getChildren();
Iterator iteratorWS = childrenWS.iterator();

while (iteratorWS.hasNext()) {

Element worksheet = (Element) iteratorWS.next();

if (worksheet.getQualifiedName() != "Worksheet"){continue;}

List childrenTable = worksheet.getChildren();
Iterator iteratorTable = childrenTable.iterator();

while (iteratorTable.hasNext()) {

Element table = (Element) iteratorTable.next();

if (table.getQualifiedName() != "Table"){continue;}

List childrenRow = table.getChildren();
Iterator iteratorRow = childrenRow.iterator();

while (iteratorRow.hasNext()) {

Element row = (Element) iteratorRow.next();

if (row.getQualifiedName() != "Row"){continue;}

List childrenCell = row.getChildren();
Iterator iteratorCell = childrenCell.iterator();
int numCeldas = 0;
String lcodArticulo = "";
String lpvpRecologic = "";
String lpaginas = "";
String lproveedor = "";
String lmp = "";
String lpvcp = "";
String lpcd = "";

boolean swHayReciclado=false;

celdas:

while (iteratorCell.hasNext()) {

Element cell = (Element) iteratorCell.next();

if (cell.getQualifiedName() != "Cell"){
continue;
}

numCeldas++;

List childrenData = cell.getChildren();
ListIterator iteratorData = (ListIterator) childrenData.iterator();

while (iteratorData.hasNext()) {

Element data = (Element) iteratorData.next();

if (data.getQualifiedName() != "Data"){
continue;
}

String value = data.getTextTrim();

// Si no hay referencia no merece la pena seguir en esta Row
if ((value == null || value.equalsIgnoreCase(""))
&& numCeldas == lcodArticuloIndex) {
break celdas;
}
if (1==1){
// Acceso al articulo reciclado
if (numCeldas == lcodArticuloIndex){

Statement statement;
ResultSet rs;
// Statement statement1;
// ResultSet rs1;

boolean lecturaReciclado = true;
lecturaReciclado:
while (lecturaReciclado) {
// Acceso a los registros que contienen el orden de proveedores de reciclado.
// De acceso a base de datos

// Try de base de datos
try{
for (int i = 0;i <or.longitudOR;i++){
String LScodProveedor;
String LScodArticulo;
// Acceso al articulo reciclado
if (or.ORcodProveedor[i] == null || or.ORcodProveedor[i].equalsIgnoreCase("")){
System.out.println("El proveedor asignado al orden de reciclados esta vacio");
break proceso;
}else{
LScodProveedor=or.ORcodProveedor[i];
}
// Lectura del articulo reciclado relacionado con el articulo de la plantilla
LScodArticulo=value;

ics = 0;lcamposSelect = new String[30];lwhere=null;lorder=null;linnerJoin=null;louterJoin=null;leftJoin=null;rightJoin=null;lon=null;
lcamposSelect[ics++] = "ARcodProveedor";
lcamposSelect[ics++] = "ARcodArticulo";
lcamposSelect[ics++] = "ARfamilia";
lcamposSelect[ics++] = "ARPVPTextoPre";
lcamposSelect[ics++] = "ARPVP1";
lcamposSelect[ics++] = "ARPVP2";
lcamposSelect[ics++] = "ARPVP3";
lcamposSelect[ics++] = "ARprecioCosto";
lcamposSelect[ics++] = "ARpaginas";
lfrom = "articulos";
// lorder = "ARcodProveedor, ARcodArticulo";
lwhere = "(ARcodProveedor='" + LScodProveedor + "' AND ARcodArticulo='" + LScodArticulo + "' AND ARarticuloActivo=True AND ARpresupuesto=True)";
query = rutinas.crearQuery(lcamposSelect,lfrom,lwhere,lorder,linnerJoin,louterJoin,leftJoin,rightJoin,lon);

statement = connection.createStatement();
rs = statement.executeQuery(query);
while (rs.next()) {
String ARPVPTextoPre = rs.getString("ARPVPTextoPre");
rs.close();
// rs1.close();
break lecturaReciclado;
} // Acceso a articulo Reciclado
rs.close();
} // Lectura de orden reciclado
// rs1.close();
// Posibles errores relacionados con la base de datos.
} catch (SQLException sqle) {
System.err.println("Error con conexion:" + sqle);
} // Fin de catch

lecturaReciclado = false;
} // while de proceso Lectura Reciclado
} // If de que estamos con el valor de referencia
if (true != (lpvpRecologic == null || lpvpRecologic.equalsIgnoreCase(""))){
Object o2 = data.setText(lpvpRecologic);
}
} // 1==0
} //Data
}//Celda
}//Row
}//Table
}//WorkSheet
// Posibles errores relacionados con la base de datos.
connection.close();
} // Fin de Try de base de datos y drivers
catch (ClassNotFoundException cnfe) {
System.err.println("Error cargando driver" + cnfe);
}
catch (SQLException sqle) {
System.err.println("Error con conexion" + sqle);
}
proceso = false;

} // Fin de While de proceso de navegacion por el documento

try {

XMLOutputter out=new XMLOutputter();
FileOutputStream fileOut=new FileOutputStream("//Principal/c-principal/recologic/plantillas marqueting/PRECIOS/productos proveedores/recologic/carga-datos-access/java/prueba4.xml");
out.output(doc,fileOut);
fileOut.flush();
fileOut.close();

}
catch (IOException e) {
System.err.println(e);
}
} // fin de metodo
}// fin de clase

papitu769
16 de Abril del 2008
Ya he encontrado el problema. Los Objetos Statement mejor cerrarlos una vez usados.