經過JDBC獲取數據庫表結構的過程當中碰到的問題及解決方案

  因爲項目中採用的是oracle數據庫,引入了ojdbc14-10.2.0.4.0.jar,因此,首先探索的就是oracle方面的解決方案。主要藉助的是OracleResultSetMetaData.class這個類,下面是這部分的代碼:
PreparedStatement ps = connection.prepareStatement(sql);
ps.execute();
OracleResultSetMetaData orsmd = (OracleResultSetMetaData) ps.getMetaData();
for(int i=1;i<=orsmd.getColumnCount();i++){
    System.out.print("字段名:"+orsmd.getColumnName(i));
    System.out.print("  字段類型:"+orsmd.getColumnTypeName(i));
    System.out.print("  字段長度:"+orsmd.getPrecision(i));
    System.out.println("  java類名:"+orsmd.getColumnClassName(i));
}

  須要注意的是,得到的orsmd的迭代是從1開始的,而不是習慣上的0。 java

  使用oracle提供的jar包的一個好處是它能夠經過getColumnClassName()這個方法把數據庫字段在java中對應的類型一併得到,省去了後期處理的一個步驟。 mysql

  可是,上面這種方法只適用於數據庫是oracle的狀況,因此下面是更通用的第二種方法: sql


//通用方法
DatabaseMetaData metaData = connection.getMetaData();
ResultSet resultSet = metaData.getColumns(null, null, "tableName", null);
while(resultSet.next()){
    System.out.print("列名:"+resultSet.getString("COLUMN_NAME"));
    System.out.print("  數據類型是:"+resultSet.getString("DATA_TYPE"));
    System.out.print("  類型名稱是:"+resultSet.getString("TYPE_NAME"));
    System.out.print("  列大小是:"+resultSet.getString("COLUMN_SIZE"));
    System.out.println("  註釋是:"+resultSet.getString("REMARKS"));
}

    這個方法是從網上搜來的,在數據庫是mysql的時候沒有任何問題,可是當數據庫切換成oracle的時候,返回的resultSet始終是null。在百思不得其解/抓耳撓腮/掀桌子×N以後,終於發現問題出在  getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)  這個方法。這個方法裏的第三個參數,也就是表名,它必須是大寫...滿滿的都是怨念,個人oracle明明是/必定是/確定是大小寫不敏感... 數據庫

    在解決上面這個問題後,很快又被第二個跳出來的bug調戲了,這貨每次出表結構都要出雙份或者三份,也就是同一個字段會返回兩到三次.....因而乎.....百思不得其解/抓耳撓腮/掀桌子×N....終於經過google發現下面這一段: oracle

In oracle, Connection.getMetaData() returns meta-data for the entire database, not just the schema you happen to be connected to. So when you supply null as the first two arguments to meta.getColumns(), you're not filtering the results for just your schema. You need to supply the name of the Oracle schema to one of the first two parameters of meta.getColumns(), probably the second one, e.g. meta.getColumns(null, "myuser", "EMPLOYEES", null); It's a bit irritating having to do this, but that's the way the Oracle folks chose to implement their JDBC driver.
    原來是由於在第二個參數爲null的狀況下,oracle會返回全部schema下的表的結構...而後,這個schema也就是第二個參數,也必須是大寫。。。我在建立用戶的時候 用的是小寫。。個人oracle明明是/必定是/確定是大小寫不敏感...


    好吧,大小寫的問題留待之後研究,問題先記錄之... app

相關文章
相關標籤/搜索