2011-06-15 43 views
4

我用下面的代碼值java.sql.SQLException:[微軟] [ODBC驅動程序管理器]無效的描述符索引

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 

這是怎麼造成的,我怎麼能解決這個問題?

+0

究竟是什麼路線被拋出?您可以在堆棧跟蹤的第一行找到行號。異常表明您正在嘗試訪問結果集中的錯誤/未知列。但是你的問題中的代碼片段並沒有提供這些信息。 – BalusC 2011-06-15 16:55:24

+1

感謝您的代碼更新。但異常處理非常差。用'e.printStackTrace()'或者'throw e'替換'System.out.println(e)'行。通過這種方式,您可以獲得完整的堆棧跟蹤,並可以瞭解發生此問題的行號。 – BalusC 2011-06-15 17:08:48

回答

9

我懷疑發佈的代碼中的其中一行引發異常。我有理由這樣說。

當您錯誤地讀取結果集時,通常會獲得帶有消息「無效的描述符索引」的SQLException。這種情況可以有多種表現方式:

  • 閱讀欄不按順序排列。恐怕,一些JDBC驅動程序會要求您從第一列開始按順序讀取列。這就是一些司機寫作的方式;讀取結果集時不能跳過任何列,因爲驅動程序實際上正在讀取流並將流中的對象轉換爲JDBC類型的對象。
  • 您可能正在讀取列索引無效或列名稱與結果集中的任何返回列不匹配的列。簡單的解決方法是修復查詢以返回所需的列,或修復代碼以不讀取缺席列。

如果你需要解決它,你需要知道你的代碼中上述哪一個條件是真的,並相應地糾正。

+0

我試圖列出我的SQL語句爲:「選擇房間ID,房間名稱,房間大小,樓層來自tblRoom」。這一次它不顯示錯誤消息,但它不會在我的JTable中生成結果 – 2011-06-15 17:19:48

+0

@Tepken,這與「SELECT * FROM tblRoom」相同嗎?即tblRoom中有4列嗎? – 2011-06-15 17:23:33

+0

確定他們是。我從其他資源搜索,他們告訴我這樣的事情。 – 2011-06-15 17:24:56

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)); 
} 
9

我有同樣的確切的錯誤,這是用於Delphi的ODBC Express Driver。

的解決方案,我發現是:

將您的varchar(max)和或varbinary(最大值)在你的SELECT查詢結束領域。 (表格定義中的順序無關緊要)。

這真的解決了我們,想與你們分享。

1

我得到一個錯誤

重度:空 值java.sql.SQLException:[微軟] [SQL Server本機客戶端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"); 
6

我知道這個bug多年來一直在PHP中使用ODBC驅動程序。嘗試將您的文本和圖像列放在選擇列表的末尾。
不使用

select * from t 

但枚舉嚴格

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

遺憾的是微軟並沒有修復該錯誤厭倦。 JDBC驅動程序正常工作。

相關問題