1
public static void updateHistory(Client winner) {
    try {
        if (winner != null) {
            getDatabase().newQuery("INSERT INTO tournaments (`players`, `winner`, `winnerKills`, `map`, `prize`) VALUES ('" + tournyPlayers.size() +"', '" + winner.playerName + "', '" + winner.killCount + "', 'Wilderness', '" + winner.gameScore + "')");
        }
        else {
            getDatabase().newQuery("INSERT INTO tournaments (`players`, `winner`, `winnerKills`, `map`, `prize`) VALUES ('" + tournyPlayers.size() +"', 'None', 'None', 'Wilderness', 'None')");            
        }

        ArrayList<Client> player = tournyPlayers;

        for (int i = 0; i < player.size(); i++) {
            if (player.get(i).killedByPlayer == "") {
                getDatabase().newQuery("INSERT INTO tournament_players (`name`, `kills`, `killedBy`, `score`, `points`) VALUES ('" + player.get(i).playerName + "', '" + player.get(i).killCount + "', 'N/A', '" + player.get(i).gameScore + "', '" + player.get(i).gamePoints + "')");
            }
            else {
                getDatabase().newQuery("INSERT INTO tournament_players (`name`, `kills`, `killedBy`, `score`, `points`) VALUES ('" + player.get(i).playerName + "', '" + player.get(i).killCount + "', '" + player.get(i).killedByPlayer + "', '" + player.get(i).gameScore + "', '" + player.get(i).gamePoints + "')");                
            }
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }       
}

さて、私がやろうとしているのは、トーナメントに関する情報を表示する新しいトーナメント行を挿入することです。今度はトーナメントにプレイヤーを追加したいので (誰がプレイしたか)、各プレイヤーを彼のデータを含む新しい行。

しかし、ここで、挿入した現在のトーナメントにプレーヤーが一致することを確認したいと思います。サーバーがダウンしてカウントが失われる可能性があるため、サーバー側で現在のサーバーの一意の番号を作成できません。

したがって、挿入されたトーナメント テーブルの auto_increment ID を使用して、挿入されたプレーヤーと一緒に追加することを考えたので、彼の ID はトーナメントの自動インクリメント ID になります。

トーナメントに挿入したのとまったく同じデータを使用せずに自動インクリメント ID を取得する方法はありますか (同じステータスのトーナメントが 2 つある可能性があるためです)。

そうする方法はありますか?

日付と時刻を含む MD5 ハッシュをトーナメントの行に追加してから、プレイヤーの行に追加することを考えていましたが、それは良い解決策ですか?

4

1 に答える 1

3

生成された主キーを次のようにStatement#getGeneratedKeys()取得ResultSetするために使用できる

ResultSet rsKeys = statement.getGeneratedKeys();
if (rsKeys.next()) {
    tournament.setId(rsKeys.getLong(1));
}

PreparedStatementasの準備中に、生成されたキーを取得したいというヒントを JDBC ドライバーに与える必要があることに注意してください。

connection.prepareStatement(strSQL, Statement.RETURN_GENERATED_KEYS);

Statementまたは、 asの実行時に

statement.executeUpdate(strSQL, Statement.RETURN_GENERATED_KEYS);

参考:
Statement#getGeneratedKeys()

この Statement オブジェクトを実行した結果として作成された自動生成キーを取得します。この Statement オブジェクトがキーを生成しなかった場合、空の ResultSet オブジェクトが返されます。

于 2013-08-20T14:24:13.590 に答える