2015-10-06 88 views
3

我的程序有兩個數據庫表:GameInfo和Characters。 這是如何工作的:一個遊戲有4個不同地名的地圖,每個添加到遊戲中的角色必須分配4個地圖中的任何一個。現在我有了一個sql語句,它返回一個名爲「Expr1001」的結果集,其中包含每個地圖上的字符數。然後,我需要將這些信息添加到jTable中,並將地圖上每個字符的相應數量與mapname關聯起來。從一個與另一個SQL表中獲取數據的計數並在java中使用此數據

我與返回每個地圖上的字符數的查詢結果集:

ResultSet qs = dbm.queryDatabase("SELECT Expr1001 FROM (SELECT GameInfo.mapname, SUM(IIF(Map = GameInfo.mapname,1,0)) FROM (SELECT * FROM [Character] INNER JOIN Player ON Character.PlayerID=Player.[ID]) AS A RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname GROUP BY GameInfo.mapname) AS [%$##@_Alias]"); 

整個方法,從數據庫中的的GameInfo表獲取遊戲信息,其中包括遊戲ID名和映射的唯一。

public Game[] getGameInfo(){ 
     Game[] arr = null; //Creates an array of Games 


    try { //getting list from database 
     ResultSet rs = dbm.queryDatabase("Select Count(GameID) as NumGames from GameInfo"); 
     //While there are still more rows to read from the database. 
     rs.next(); 
     int count = rs.getInt("NumGames"); 
     arr = new Game[count]; 
     String sql = "Select * from GameInfo"; 
     // System.out.println(sql); 

     rs = dbm.queryDatabase(sql); 
     //Take the info from the current row 
     //Add the info to the array 
     ResultSet qs = dbm.queryDatabase("SELECT Expr1001 FROM (SELECT GameInfo.mapname, SUM(IIF(Map = GameInfo.mapname,1,0)) FROM (SELECT * FROM [Character] INNER JOIN Player ON Character.PlayerID=Player.[ID]) AS A RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname GROUP BY GameInfo.mapname) AS [%$##@_Alias]"); 
     for(int i = 0; rs.next(); i++){ 

      arr[i] = new Game(
        rs.getInt("GameInfo.GameID"), 
        rs.getString("GameInfo.mapname"), 
       qs.getInt(i)); 
     }//Creates a Game from the currently selected info 


    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, "Failed to get Games"); 
     e.printStackTrace(); 
    } 
    return arr; 
} 

}

的數據然後加入到JTable這是在GameInfoPanel類面板上:

public void refreshTable() { 
    //remove old stuff 
    refreshing = true; 

    Game[] arr = gim.getGameInfo(); 
    DefaultTableModel model = (DefaultTableModel) GameInfoTable.getModel(); 
    while (model.getRowCount() > 0) { 
     model.removeRow(0); 

    } 
    for (int i = 0; i < arr.length; i++) { 
     model.addRow(new Object[]{ 
      arr[i].getNumberOfCharacters(), 
      arr[i].getID(), 
      arr[i].getMapName()}); 
    } 
    refreshing = false; 

    //load new data from database using manager 
} 

總是收到指向該結果集適量線錯誤:「用戶缺少特權或對象找不到:A.CHARACTER.MAP「,當我嘗試運行程序時,即使將此語句複製到Microsoft Access並運行它時,也沒有問題。

請幫忙! 謝謝。

(我還是在學校,所以不是真的對這個天才在所有所以請可憐,如果我做了一些愚蠢的事情)

+0

嘗試更換'A.CHARACTER.MAP'用'CHARACTER.MAP' –

+0

@AdamMartin錯誤現在是:用戶缺少特權或找不到對象:CHARACTER.MAP – James

回答

1

不要運行select count(*)率先拿到遊戲的數量分配一個數組。構建你的結果是List,它將根據需要自動擴展。如果需要,您可以隨後將列表轉換爲陣列。

當您可以完成這項工作時,請不要運行兩個查詢,尤其是當您已經加入相關表格時。

你的SQL是不可讀的,所以在這裏它是在一個更可讀的格式:

String sql = "SELECT Expr1001" + 
       " FROM (SELECT GameInfo.mapname" + 
          ", SUM(IIF(Map = GameInfo.mapname,1,0))" + 
         " FROM (SELECT *" + 
           " FROM [Character]" + 
          " INNER JOIN Player ON Character.PlayerID=Player.[ID]" + 
          ") AS A" + 
        " RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname" + 
        " GROUP BY GameInfo.mapname" + 
        ") AS [%$##@_Alias]"; 

外部查詢什麼也不做。擺脫它。
不要SELECT *。選擇你想要的列,即Character.map
既然你想GameID,把它添加到GROUP BY
指定SUM值的別名。

​​
+0

感謝您的幫助!但是,Netbeans指定「類型列表不帶參數」。有關於此的任何信息? – James

+0

我想你輸入了錯誤的'List'。 ['java.util.List'](http://docs.oracle.com/javase/7/docs/api/java/util/List.html)。 – Andreas

+0

是的,我做了...非常感謝您的幫助。我真的很感激! – James

相關問題