【问题标题】:java.sql.SQLException:[Microsoft][ODBC Driver Manager] Invalid descriptor indexjava.sql.SQLException:[Microsoft][ODBC Driver Manager] 无效的描述符索引
【发布时间】:2011-06-15 16:52:49
【问题描述】:

我使用下面的代码

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

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 到底是在哪一行抛出的?您可以在堆栈跟踪的第一行中找到行号。该异常表明您正在尝试访问结果集中的错误/未知列。但是您问题中的代码 sn-p 并没有泄露这一点。
  • 感谢代码更新。但是异常处理很差。将System.out.println(e) 行替换为e.printStackTrace() 或仅throw e。通过这种方式,您可以获得完整的堆栈跟踪信息,并且可以了解发生此问题的行号。

标签: java jdbc


【解决方案1】:

我也遇到了同样的错误,这是来自 Delphi 的 ODBC Express 驱动程序。

我找到的解决办法是:

将 varchar(max) 和/或 varbinary(max) 字段放在选择查询的末尾。 (表定义中的顺序无关紧要)。

这确实为我们解决了问题,想与大家分享。

【讨论】:

    【解决方案2】:

    我怀疑异常是由发布的代码中的一行引发的。我有理由这么说。

    当您错误地读取结果集时,通常会获得带有“Invalid descriptor index”消息的 SQLException。这种情况可以通过多种方式表现出来:

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

    如果你需要解决它,你需要知道你的代码中满足上述哪一个条件,并进行相应的纠正。

    【讨论】:

    • 我试图将我的 SQL 语句列出为:“SELECT RoomID, RoomName, RoomSize, Floor From tblRoom”。这次它不显示错误消息,但它不会在我的 JTable 中生成结果
    • @Tepken,这和“SELECT * FROM tblRoom”一样吗?即 tblRoom 中有 4 列吗?
    • 确定是的。我从其他资源中搜索,他们告诉我这样的事情。
    • 奇怪。我认为您可以向 Microsoft 发送账单以查找错误。
    • “不按顺序读取列...”我改变了这个,喝了杯咖啡,宰了一只鸡,然后一切都像魔术一样消失了。谢谢。
    【解决方案3】:

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

    select * from t
    

    但严格列举

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

    不幸的是,微软并没有因为修复错误而感到疲倦。 JDBC 驱动工作正常。

    【讨论】:

    • 相反的工作在我的情况下,以前我传递查询 select plain_column1, plain_column2, .... image_column from t 这给了我错误,但是当我将查询更改为 select * from t 然后异常解决了。
    【解决方案4】:

    如果您试图在索引值 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));
    }
    

    【讨论】:

      【解决方案5】:

      我遇到了一个错误

      严重:空 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");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多