2017-04-20 45 views
1

我想通過這個類使SQL操作更容易,但我得到一個異常,指示結果集爲空。相同的查詢在MySQL工作臺中工作。我不明白問題是什麼。Sql異常空的結果集,當它在我的Sql工作臺上工作時非法操作

import java.sql.*; 

public class DataBase 
{ 
    private String user = "jsmith"; 
    private String pass = "LetMeIn"; 
    private String url = "jdbc:mysql://localhost:3306/java"; 
    private String Schema, Table; 
    private Connection con; 
    private ResultSet Result; 
    private PreparedStatement pQuery; 

    public DataBase(String Database, String Table) 
    { 
     this.Schema = Database; 
     this.Table = Table; 
    } 

    private boolean createConnection() 
    { 
     boolean b = false; 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection(url, user, pass); 
      b = true; 
     } catch (Exception e) { 
      System.out.println("Connection Exception " + e.getMessage()); 
      e.printStackTrace(); 
      b = false; 
     } 
     return b; 
    } 

    public String getStringData(String Desireddata, String fromColumn, String condition) 
    { 
     boolean b = createConnection(); 
     String retrivedString = ""; 
     if (b != false && Schema != null && Table != null) { 
      try { 
       pQuery = con.prepareStatement("SELECT ? FROM " + Schema + "." + Table + " WHERE ? = ?"); 
       pQuery.setString(1, Desireddata); 
       pQuery.setString(2, fromColumn); 
       pQuery.setString(3, condition); 
       Result = pQuery.executeQuery(); 
       Result.next(); 
       retrivedString = Result.getString(Desireddata); 
      } catch (Exception e) { 
       retrivedString = "False"; 
       System.out.println(e.getMessage()); 
       e.printStackTrace(); 
      } 
     } else { 
      System.err.println("No Connection or Database not Defined "); 
      retrivedString = "False"; 
     } 
     return retrivedString; 
    } 
} 

和異常:

Illegal operation on empty result set. 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:817) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5514) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5434) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5474) 
    at sync.DataBase.getStringData(DataBase.java:44) 
    ... 
+1

對於對象名稱(表,列等),不能使用參數綁定,僅限於值。 –

回答

0

你有兩個問題:

  1. 不能使用參數對象名稱綁定,這樣做SELECT ? FROM...是無效的。
  2. 您不檢查ResultSet.next()的返回值。如果返回true有數據要讀取,如果它返回false則不再有數據。

要解決的第一個問題,你需要從改變你的代碼:

pQuery = con.prepareStatement("SELECT ? FROM ... WHERE ? = ?"); 

到:

pQuery = con.prepareStatement("SELECT " + Desireddata + " FROM ... WHERE " + fromColumn + " = ?"); 

但要確保DesireddatafromColumn不是從用戶直接導出輸入,否則您將很容易受到SQL注入攻擊。

要解決的第二個問題,更改:

Result.next(); 
retrivedString = Result.getString(Desireddata); 

到:

while (Result.next()) { /* You COULD use 'if' instead */ 
    retrivedString = Result.getString(Desireddata); 
} 

雖然不是一個問題,曲風你不應該有以大寫字母開頭的實例變量。因此,您應該使用resultresultSetrs而不是Result。通常,如果您要定義新類型(如classinterface),則只會將大寫字母用作第一個字符。

+0

非常感謝你......它工作正常。 –

0

你的ResultSet結果爲空。所以在處理之前,檢查Result是否爲null。