java.sql.SQLException:[Microsoft] [ODBC驱动程序管理器]无效的描述符索引

Tep*_*orn 6 java jdbc

我使用以下代码

try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con = DriverManager.getConnection("jdbc:odbc:access");
    String sql = "Select * from table";
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery( sql );
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    for (int i = 1; i <= columns; i++) {
        columnNames.addElement( md.getColumnName(i) );
    }
    while (rs.next()) {
        Vector row = new Vector(columns);
        for (int i = 1; i <= columns; i++){
            row.addElement( rs.getObject(i) );
        }
        data.addElement( row );
    }
    rs.close();
    stmt.close();
}catch(Exception e){
    System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)

它显示:

java.sql.SQLException:[Microsoft][ODBC Driver Manager] Invalid descriptor index
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

Vin*_*lds 10

我怀疑发布的代码中的一行是抛出异常.我有理由说明这一点.

当您错误地读取结果集时,通常会获得带有"无效描述符索引"消息的SQLException.此方案可以通过多种方式显示:

  • 不按顺序读取列.我担心,一些JDBC驱动程序将要求您按顺序读取列,从第一列开始.这就是一些司机的写作方式; 在读取结果结果集时,不能跳过任何列,因为驱动程序实际上正在读取流并将流中的对象转换为JDBC类型的对象.
  • 您可能正在读取其索引无效或列名与结果集中任何返回列不匹配的列.简单的解决方案是修复查询以返回所需的列,或修复代码以不读取缺少的列.

如果您需要解决它,您需要知道上述哪个条件在您的代码中是正确的,并相应地纠正.

  • "不按顺序阅读专栏......"我改变了这种情况,喝了一杯咖啡,宰了一只鸡然后就像魔法一样消失了.谢谢. (3认同)

Rem*_*mco 10

我有一个完全相同的错误,这是用于Delphi的ODBC Express驱动程序.

我找到的解决方案是:

将varchar(max)和/ varbinary(max)字段放在select Query的末尾.(表定义中的顺序无关紧要).

这真的为我们修好了,想与你们分享.


Hin*_*ink 6

多年来,我通过使用PHP驱动程序来了解这个错误.尝试将文本和图像列放在选择列表的末尾.
不要用

select * from t
Run Code Online (Sandbox Code Playgroud)

但是要严格列举

select plain_column1, plain_column2, .... image_column from t
Run Code Online (Sandbox Code Playgroud)

不幸的是,微软不会因为修复bug而感到厌倦.JDBC驱动程序工作正常.