2013-04-03 15 views
3

我試圖訪問databasemetadata檢索存在於它的所有表的屬性存在於數據庫中。 getTables應該返回10的ResultSet列。不能以檢索所有表使用的DatabaseMetaData

當我嘗試遍歷ResultSet獲取所有列數據,我得到

Exception in thread "main" java.sql.SQLException: Invalid column index 

我取回從第一行前5個數據,然後打印第6列時發生異常 ,TYPE_CAT

相關代碼:

DatabaseMetaData dbmd = connection1.getMetaData(); 
    ResultSet rs = dbmd.getTables(null, null, null, new String[]{"TABLE"}); 
     while(rs.next()){ 
      for(int i=1;i<11;i++){ 
       System.out.print(rs.getString(i)+" "); 
      } 
      System.out.println(""); 
     } 
+0

看起來很奇怪,從1開始計數。 – Randy

+1

@Randy:這就是JDBC的工作原理(所有內容都基於1) –

+1

嘗試使用rs.getMetadata()。getColumnCount()打印驅動程序返回的實際列數()'。也許你有一個錯誤的JDCB驅動程序,它不符合JDBC規範。你正在使用哪種DBMS和JDBC驅動程序? –

回答

0

而不是用你的11值,嘗試獲得了ResultSetMetaData,並確定列數,以確認你的欄檢索:

ResultSetMetaData rsMetaData = rs.getMetaData(); 
int numberOfColumns = rsMetaData.getColumnCount(); 

從中,你可以得到列名稱和值,並使用getColumnName(int)方法確認要檢索的內容。

+0

雅我改變了它,它的工作與例外和打印只有前4列,你不認爲有10列resultsetmetadata –

+0

雅我能夠正確地檢索所有4列的列名。我的問題是,爲什麼它沒有返回所有的表屬性,所有10列 –

1

它看起來像你需要使用一個非常古老的JDBC 2驅動程序,或者驅動程序不兼容JDBC 3.0,4.0和/或4.1沒有規範要求的所有列。

雖然JDBC指定結果集(至少)應該返回的列,但驅動程序實現者需要實際正確定義ResultSet及其值。 JDBC只是一個規範和一組接口,所以它不能確保 - 在運行時 - 所有驅動程序都會返回所有指定的列。有認證測試,但這些都需要官僚障礙(開源)或金錢+官僚障礙(商用)鉅額款項,因此並非所有的JDBC驅動程序實施者懶得測試兼容性。

在JDBC 2(爪哇1.3)DatabaseMetaData.getTables(鏈接到Java 1.3 apidoc)僅返回五列:

  1. TABLE_CAT字符串=>表的目錄(可能爲空)
  2. TABLE_SCHEM字符串=>表模式(可以爲空)
  3. TABLE_NAME字符串=>表名稱
  4. TABLE_TYPE字符串=>表型。典型的類型是 「TABLE」, 「VIEW」, 「SYSTEM TABLE」, 「GLOBAL TEMPORARY」, 「LOCAL TEMPORARY」, 「別名」, 「SYNONYM」。
  5. 備註對錶

鑑於JDBC 3.0(Java 1.4/Java 5),JDBC 4.0(Java 6)和JDBC 4字符串=>說明性註釋。1(Java 7)定義了5列:

  1. TABLE_CAT字符串=>表類別(可null
  2. TABLE_SCHEM字符串=>表模式(可以是null
  3. TABLE_NAME String =>表名
  4. TABLE_TYPE String => t能型。典型的類型是 「TABLE」, 「VIEW」, 「SYSTEM TABLE」, 「GLOBAL TEMPORARY」, 「LOCAL TEMPORARY」, 「別名」, 「SYNONYM」。
  5. 備註對錶字符串=>的解釋性註釋
  6. TYPE_CAT字符串=>類型的目錄(可以是null
  7. TYPE_SCHEM字符串=>類型模式(可null
  8. TYPE_NAME String =>類型名稱(可能爲null
  9. SELF_REFERENCING_CO L_NAME字符串=>一類型表的指定的「識別符」的列名(可以是null
  10. REF_GENERATION字符串=>指定如何SELF_REFERENCING_COL_NAME值被創建。值是「SYSTEM」,「USER」,「DERIVED」。 (可能是null

你可能要檢查是否有可用的數據庫更新的驅動程序。

+0

嗨,馬克我只使用ojdbc14罐子只有 –

+0

升級到更新版本的Oracle JDBC驅動程序(順便說一句,ojdbc14只是告訴你它是用於Java 1.4,不是哪個版本的它是驅動程序)。否則,甲骨文真的因爲沒有正確實施他們而搞砸 - 因爲他們購買了Sun自己的規格。 –

相關問題