有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ms access Java SQL更新命令不工作

我遇到了一个问题,我的GUI程序没有显示错误,也没有用我给出的UPDATE语句更新jTable。INSERT和DELETE工作正常,但这不是出于某种原因

我正在使用UCanAccess,这样我就可以使用MSAccess数据库和rs2xml来处理resultset

我在这里修改的表是一个连接表,其中包含两个主键,分别用于director_id和movie_id,它们链接到单独的表,因此这是一个多对多关系

 private void jButtonEditActionPerformed(java.awt.event.ActionEvent evt) {                                            
        DefaultTableModel tableModel = (DefaultTableModel) jTableDBView.getModel();

        // If there's an issue...
        if(error handling snipped out...)
        {
        }
        else
        {
            runQuery(Integer.parseInt(jTextFieldDirectorID.getText()), Integer.parseInt(jTextFieldMovieID.getText()), "UPDATE");
            jTextAreaDBView.append("Updated row: " + (jTableDBView.getSelectedRow() + 1) + " (Director ID: " + jTextFieldDirectorID.getText() + " & Movie ID: " + jTextFieldMovieID.getText() +")\n");
            updateDB();
        }

这叫

public void runQuery(int movieID, int directorID, String typeOfCommand) throws SQLException
{
    Connection conn = DriverManager.getConnection(jdbcURL);
    ResultSet rs = null;
    PreparedStatement stat = null;

    try
    {
        //snipped insert/delete

        else if(typeOfCommand.equals("UPDATE"))
        {
            stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE (director_id = ?) AND (movie_id = ?)"); 
            stat.setInt(1, directorID);
            stat.setInt(2, movieID);
            stat.setInt(3, directorID);
            stat.setInt(4, movieID);

            int result = stat.executeUpdate();
        }

private void updateDB()
{
    try
    {
        Connection conn = DriverManager.getConnection(jdbcURL);
        PreparedStatement pst = conn.prepareStatement(query);
        Class.forName(driver);
        ResultSet rs = pst.executeQuery();
        jTableDBView.setModel(DbUtils.resultSetToTableModel(rs)); // Imported lib function
        conn.close();
        pst.close();
        rs.close();
    }
    catch (Exception ex)
    {
        // Add a window here
    }
}

更新-修复了runQuery块:我添加了2个新的jTextFields来输入新数据,我现在明白了它是如何工作的。谢谢你,简

            int result;
            int newDirectorID = Integer.parseInt(jTextFieldNewDirectorID.getText());
            int newMovieID = Integer.parseInt(jTextFieldNewMovieID.getText());

            stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE director_id = ? AND movie_id = ?"); 
            stat.setInt(1, newDirectorID);
            stat.setInt(2, newMovieID);
            stat.setInt(3, directorID);
            stat.setInt(4, movieID);
            result = stat.executeUpdate();

共 (1) 个答案

  1. # 1 楼答案

    我可能弄错了-但是你的更新没有任何作用。它将(movieId, directorId)分配给已经具有(movieId,directorId)

    因此,如果已经有一行-什么也不会发生。如果没有匹配的行,也不会发生任何事情

    例如,如果一部电影的导演确实在某个时候发生了变化,那么更新是有意义的

    在这种情况下,您需要一个变量newDirectorID,并将其作为新值输入:

            int newDirectorID; // YOU NEED TO PROVIDE A VALUE
            stat = conn.prepareStatement("UPDATE Movie_Directors SET director_id = ?, movie_id = ? WHERE director_id = ? AND movie_id = ?"); 
            stat.setInt(1, newDirectorID);
            stat.setInt(2, movieID);
            stat.setInt(3, directorID);
            stat.setInt(4, movieID);
    
            int result = stat.executeUpdate();
    

    这实际上会更改表中的某些数据,因此,如果(directorID, movieID)以前存在,则更新的行数应为1