Xml from java

De nuevo aquí, esto es de locos, ya no se si es por la base de datos o por que ando nula, quiero conectarme a una base de datos Paradox y obtener una consulta para luego crear un archivo xml, lo que pasa que me lo crea pero no me lo escribe, creo que la consulta la hace correctamente pero no se que pasa que le sale este error:
Compile:
Run:
java.sql.SQLException: [Microsoft][Administrador de controladores ODBC] Índice de descriptor no válido
At sun. Jdbc. Odbc. JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
At sun. Jdbc. Odbc. JdbcOdbc.standardError(JdbcOdbc.java:7115)
At sun. Jdbc. Odbc. JdbcOdbc. SQLColAttributesString(JdbcOdbc.java:2668)
At sun. Jdbc. Odbc. JdbcOdbcResultSetMetaData. GetColAttributeString(JdbcOdbcResultSetMetaData.java:793)
At sun. Jdbc. Odbc. JdbcOdbcResultSetMetaData. GetColumnName(JdbcOdbcResultSetMetaData.java:355)
El codigo es este
import java.sql.Connection;
import java.sql.Statement;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.io.*;
class JDBCapp {
static Connection con;
public static void main (String args[]) {
ResultSet rs = null;
Statement stmt = null;
String sql, nombre;
try {
// conexion base de datos
con = AccessCon.getConnection();
sql = "select * from HISTCOMM";
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
java.io.FileWriter fw= new java.io.FileWriter("c:/consulton.xml");
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = rs.getMetaData().getColumnCount();
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){
nombreColumnas = rs.getMetaData().getColumnName(i);
}
while(rs.next()){
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++){
fw.write(" <" + nombreColumnas + ">" + rs.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
fw.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (con != null) con.close();
if (stmt != null) stmt.close();
if (rs != null) rs.close();
}
catch (Exception e) {
}
}
}
}
class AccessCon {
public static Connection getConnection() throws Exception {
Driver d = (Driver)Class.forName
("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
Connection c = DriverManager.getConnection
("jdbc:odbc:datos");
return c;
}
}
Es un pequeño prototipo para luego pasarlo ala aplicación grande.

1 respuesta

Respuesta
1
El error te lo esta dando al obtener el nombre de una columna. No se por qué puede ser. Yo que tu sustituía el bucle donde obtienes los nombres de las columnas, por este otro:
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){

    try{
         nombreColumnas(i) = rs.getMetaData().getColumnName(i);
         System.out.println("el nombre de la columna " + i + " es " + nombreColumnas(i);

    }
     catch (Exception e){
           System.out.println ("Error obteniendo el nombre de la columna " + i);
           nombreColumnas(i) = "Columna_" + i;

     }
}

Nota: he sustituido los corchetes por paréntesis cuando escribo "nombreColumnas(i)", para que el editor de texto de TodoExpertos no me los elimine.
De esta forma, trazará por la consola todos los nombres de columna y sabremos cuales están dando problemas. Compara los resultados con la tabla en Paradox y tendrás las columnas conflictivas. Aunque de problemas, el método se seguirá ejecutando
Siento no poder ofrecerte más ayuda.
Hola, por lo que veo va ser de la base de datos, que significa error en la columna 0 ¿? ¿
Error obteniendo el nombre de la columna 0
el nombre de la columna 1 es CÓDIGO
el nombre de la columna 2 es IDENT
el nombre de la columna 3 es CLAVE
el nombre de la columna 4 es PERMON
el nombre de la columna 5 es PERCON
el nombre de la columna 6 es PERHIS
el nombre de la columna 7 es PERCFN
el nombre de la columna 8 es PERSEG
el nombre de la columna 9 es NOMBRE
el nombre de la columna 10 es DIRECC
java.sql.SQLException: [Microsoft][Administrador de controladores ODBC] Índice de descriptor no válido
Muchas gracias por la ayuda prestada
Vale, ya se lo que pasa:
En los bucles, cambia:
for (int i=0; i<numColumnas; i++)
por:
for (int i=1; i<=numColumnas; i++)
Esto es porque en los métodos de acceso a las columnas hay que pasarle el ordinal de la columna, pero empezando en el 1, no en 0. Es decir, que para obtener el valor de la primera columna es getString(1), y no getString(0).
Con el cambio en el bucle debería bastar.
Hola, perdona por la tardanza, pero es que estuve de viaje, quería comentarte que cambie a uno el valor de i y si efectivamente me lo escribe, pero el problema que tengo es que solo me escribe el ultimo registro de la tabla, estuve haciendo diversas pruebas y no encontré el motivo por que me escribe el ultimo registro, encima la ultima columna de la tabla tampoco me la muestra, lo más raro de todo esto es que le cambié el limite del bucle para que recorriera todo hasta el final y me casca, esto es un poco raro, ¿será problema del driver? ¿Atentamente un saludo¡
Lo de que no te escribe la ultima columna: asegurate de que, además de haber cambiado en los bucles que empiecen por 1, las comparaciones debe ser "i<=numColumnas", y no "i
Lo de que solo escribe el ultimo registro: creo que el fw. Close() está dentro del "while(rs.next()){" y debería estar fuera, cuando se haya recorrido todos los registros.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas