-2

SQL データベースのエントリ/行を削除するメソッドの作成について、助けが必要です。これには JBDC、JSP、および Java を使用します。JSP サイトで動作する add メソッドが既にあります。問題は、これを機能させるためにオブジェクトを作成する必要があるかどうかわからないことです。これまでのコード JSP は次のとおりです (removeMatch.jsp):

    <div class="content">

    <%
        String databaseId = request.getParameter("id");
        String matchDate = request.getParameter("matchDate");
        String matchTime = request.getParameter("matchTime");
        String meetingTime = request.getParameter("meetingTime");
        String series = request.getParameter("series");
        String opponent = request.getParameter("opponent");
        String matchLocation = request.getParameter("matchLocation");


        if (matchDate != null && matchTime != null && meetingTime != null && series != null && opponent != null && matchLocation != null) {
            int intSeries = Integer.parseInt(series);
            Match match = new Match(matchDate, matchTime, meetingTime, intSeries, opponent, matchLocation);

            //cast string to long value
            long longDatabaseId = Long.parseLong(databaseId);
            match.setDatabaseId(longDatabaseId);

            //remove the match
            MatchMapper.removeMatch(match);

            //Test in console, they don't print the same values that are connected to the databaseId:
                System.out.println(databaseId);
                System.out.println(matchDate);
                System.out.println(matchTime);
                System.out.println(meetingTime);
                System.out.println(series);
                System.out.println(opponent);
                System.out.println(matchLocation);
        }
    %>

    <h3>Vælg de kampe som du vil slette og dermed fjerne fra
        databasen:</h3>
    <form action="removeMatch.jsp" method="post">
        <fieldset>
            <table border="1">
                <tr>
                <!-- TABEL PASSER IKKE OVER ENS!!!! -->

                    <th></th>
                    <th>Dato</th>
                    <th>Modstander</th>
                    <th>Spilletid</th>
                    <th>Mødetid</th>
                    <th>Spillested</th>
                    <th>Serie</th>
                </tr>
                <%
                    ArrayList<Match> matches = MatchMapper.getAllMatches();
                    for (Match m : matches) {
                %>
                <tr>
                    <td><input type="checkbox" name="id" value=<%=m.getDatabaseId()%>></td>
                    <td><input type="hidden" name="matchDate" value=<%=m.getDate()%>><%=m.getDate()%></td>
                    <td><input type="hidden" name="matchTime" value=<%=m.getMatchStart()%>><%=m.getMatchStart()%></td>
                    <td><input type="hidden" name="meetingTime" value=<%=m.getMeetingTime()%>><%=m.getMeetingTime()%></td>
                    <td><input type="hidden" name="series" value=<%=m.getSeries()%>><%=m.getSeries()%></td>
                    <td><input type="hidden" name="opponent" value=<%=m.getOpponent()%>><%=m.getOpponent()%></td>
                    <td><input type="hidden" name="matchLocation" value=<%=m.getLocation()%>><%=m.getLocation()%></td>
                </tr>
                <%
                    }
                %>
            </table>

            <a href="matchTable.jsp"><input type="submit" value="Slet Kampe" /></a>

        </fieldset>
    </form>
</div>

アイデアは、ユーザーが削除したい行をチェックしてから、別の Java ファイルからのメソッドがデータベース内の行を削除することです (removeMatch() @ MatchMapper.java):

    public static void removeMatch(Match match) {
    Connection con = null;
    try {
        con = JDBCConnectionFactory.getInstance().getNewConnection();
        // creates empty string
        String sql = "";
        // if Match  exists in database, then prepare to call
        // a DELETE FROM table_name WHERE some_column=some_value statement (matchDate and opponent)
        if (match.isInDatabase()) {
            sql = "DELETE FROM matches WHERE ID = ?) "
                    + "VALUES (?)";
        }
        // if Match doesn't exist in database, then prepare to make an
        // return 
        else {
            System.out.println("Kamp findes ikke i databasen");
        }

        PreparedStatement prep = con.prepareStatement(sql);
        prep.setLong(1, match.getDatabaseId());
        // if the match already exists in database, then get the id (so it
        // won't create a new id)
        if (match.isInDatabase()) {
            prep.setLong(2, match.getDatabaseId());
        }
        // execute insert/update
        prep.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JDBCConnectionFactory.getInstance().closeConnection(con);
    }

}

正しい databaseId を取得できますが、コンソールへのテスト出力は、databaseId が「1」の行の値を出力し続けます。おそらく正しい値を渡す方法はあると思いますが、私にはわかりません。もう 1 つの問題は、removeMatch が一致を削除しないことです。実際には、データベースに何の変更も加えません。

4

1 に答える 1

0

まず第一に、あなたの DELETE sql は間違っているように見えます:

sql = "DELETE FROM matches WHERE ID = ?) " // Why is there a closing parenthesis?
          + "VALUES (?)";      // Why are you using VALUES in a DELETE?

私はただ使うだろう

sql = "DELETE FROM matches WHERE ID = ? ";

これにより、次の行が不要になります。

if (match.isInDatabase()) {
    prep.setLong(2, match.getDatabaseId());
}

最後に、データベースに変更を加えないという問題を解決するために、tryブロックを次のように終了します。

con.commit();

autocommit を に設定している場合、これは必要ないかもしれませんtrue。あなたを批判するつもりはありませんが、JDBC コードを書くのはこれが初めてのようです。その場合は、このチュートリアルを実行することを強くお勧めします。JDBC 原則の基本的な説明をすべて提供します。

于 2012-05-29T14:50:39.877 に答える