2013-07-04 194 views
0

我正在使用Java和MySQL的Web應用程序工作。無法從ResultSet中獲取值

我創建了一個方法,該方法應該根據數據庫中的各個表返回各個列名的ArrayList。

但是,當我調試該方法時,我意識到while(rs.next())會導致錯誤。我用這個site作爲參考,因此我不確定哪裏出了問題。

這是代碼。謝謝。

// Returns the the all the columns in the table 
public ArrayList getColumnName(String tableName) throws SQLException { 
    ResultSet rs = null; 
    List<String> columnName = new ArrayList<String>(); 

    Statement st = null; 
    Connection con = null; 

    try { 
     // Get a connection from the connection factory 
     con = DriverManager.getConnection("jdbc:mysql://localhost:3306/information_schema", "root", "xxxx"); 

     // Create a Statement object so we can submit SQL statements to the driver 
     st = con.createStatement(); 

     StringBuilder sql = new StringBuilder("SELECT column_name FROM information_schema.columns " + 
       "WHERE table_schema = 'testDB' AND table_name = '"); 

     sql.append(tableName).append("'"); 

     rs = st.executeQuery(sql.toString()); 

     while (rs.next()) { // getting error.. 
      columnName.add(rs.getString("column_name")); 
     } 

    } catch (SQLException ex) { 
     Logger.getLogger(ModificationPage.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (con != null || st != null) { 
      st.close(); 
      con.close(); 
     } 
    } 

    return (ArrayList) columnName; 
} 
+1

你看到什麼錯誤? –

+0

沒有堆棧跟蹤,發生的事情是從while(rs.next())開始,它會逐步捕獲(SQLException ex)。同時,在我的Web應用程序中,頁面將刷新,而應該顯示的表格組件不存在。 –

回答

1

按照Javadoc of 1.6(不知道的Java版本你正在使用):

拋出: SQLException - 如果發生數據庫訪問錯誤,或者調用此方法在已關閉的結果集

如果你真的到達了調用rs.next()的那一行,那麼發生數據庫錯誤就是,這是非常非常不可能的。所以,最可能的結果是結果集被關閉。

請改變你的代碼下面,看看你仍然可以得到在同一行錯誤:

while (!rs.isClosed() && rs.next()) { // getting error.. 
     columnName.add(rs.getString("column_name")); 
} 

此外,聖SQL注入攻擊,蝙蝠俠!

將原始字符串視爲您正在做的事情並將其包含在單引號內導致此代碼具有SQL注入漏洞。基本上,惡意用戶所要做的就是用單引號(')結束查詢,然後運行自己的查詢。

+0

非常感謝!它正在工作。我只是在製作一個原型,所以一個工作組件現在可以完成;) –

0

因此,例外從未發生過?

查詢誤差應在rs = st.executeQuery(sql.toString())被拋出,如果是這樣的話,但如果它做出while並沒有重複,這是因爲一個空結果

也許你傳遞錯誤的參數給的查詢?