java.sql.SQLException:[Microsoft][ODBC Driver Manager] 无效的描述符索引

Posted

技术标签:

【中文标题】java.sql.SQLException:[Microsoft][ODBC Driver Manager] 无效的描述符索引【英文标题】:java.sql.SQLException:[Microsoft][ODBC Driver Manager] Invalid descriptor index 【发布时间】: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。通过这种方式,您可以获得完整的堆栈跟踪信息,并且可以了解发生此问题的行号。 【参考方案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");

【讨论】:

以上是关于java.sql.SQLException:[Microsoft][ODBC Driver Manager] 无效的描述符索引的主要内容,如果未能解决你的问题,请参考以下文章

Oracle DB:java.sql.SQLException:关闭连接

Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误

Java:Sqlexception:位置不支持的 SQL92 令牌:178

java.sql.SQLException:接近“on”:语法错误问题

java.sql.SQLException:架构“ROOT”不存在