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