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

时间:2011-06-15 16:52:50

标签: 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);
}

显示:

java.sql.SQLException:[Microsoft][ODBC Driver Manager] Invalid descriptor index

这是如何引起的?如何解决?

5 个答案:

答案 0 :(得分:10)

我怀疑发布的代码中的某一行引发了异常。我有理由说明这一点。

当您错误地读取结果集时,通常会获得带有“无效描述符索引”消息的SQLException。此方案可以通过多种方式表现出来:

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

如果您需要解决它,您需要知道上述哪一个条件是正确的,并相应地纠正。

答案 1 :(得分:10)

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

我找到的解决方案是:

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

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

答案 2 :(得分:6)

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

select * from t

但严格枚举

select plain_column1, plain_column2, .... image_column from t

不幸的是,微软并没有因为修复这个bug而感到厌倦。 JDBC驱动程序工作正常。

答案 3 :(得分:1)

如果您尝试在索引值0中获取结果集变量值,则会发生这种情况。 例如: 考虑一个有5列的表:

ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
while(rs.next())
{
   for(int i=0;i<5;i++)
   //This will throw the exception
   System.out.println(rs.getString(i)); //Since the value will be returned from 1 not 0
   //The below code was the right way
   System.out.println(rs.getString(i+1));
}

答案 4 :(得分:1)

我收到了错误

严重:空 java.sql.SQLException:[Microsoft] [SQL Server Native Client 10.0]无效的描述符索引

代码是

String sqlStr = "select soldItems.payment as aa, Sysuser.name as sname, Books.Name as abookName, soldItems.Qunt as qunt, soldItems.date as soldBooks from Sysuser inner join soldItems on soldItems.CustomerId=Sysuser.id inner join Books on Books.bookId=soldItems.bookId where CustomerId='" + cusId + "' and PaymentDone is NULL";
    System.out.println(sqlStr);
    DbConnection con = new DbConnection();
    con.getConnection();
    ResultSet rs = con.getData(sqlStr);
    while (rs.next()) {
        int i = 0;


        dataArry[i][0] = rs.getString("abookName");
        dataArry[i][1] = rs.getString("qunt");
         dataArry[i][2] = rs.getString("aa");
        dataArry[i][3] = rs.getString("soldBooks");

        i++;
    }

修复是rs.getString需要与SQL的顺序相同

所以代码需要

       dataArry[i][2] = rs.getString("aa");
        dataArry[i][0] = rs.getString("abookName");
        dataArry[i][1] = rs.getString("qunt");

        dataArry[i][3] = rs.getString("soldBooks");