1
private void sUpdateBtnActionPerformed(java.awt.event.ActionEvent evt) {
        String query = "UPDATE Student SET lastname = ?, firstname = ?, course = ?, yearlvl = ?, username = ?, password = ?";
        dbConn = DbConnection.dbConnect();
        prepState = dbConn.prepareStatement(query);
        prepState.setString(1, sLnTf.getText());
        prepState.setString(2, sFnTf.getText());
        prepState.setString(3, courseTf.getText());
        prepState.setInt(4, Integer.parseInt(yearLvlTf.getText()));
        prepState.setString(5, sUserTf.getText());
        prepState.setString(6, sPassTf.getText());
        prepState.executeUpdate();
    }catch(Exception e){
        appendEvent(sdf.format(new Date()) + " Error: " + e);
    }
}

连接数据库的方法:

import java.sql.*;
import javax.swing.*;

public class DbConnection {
    Connection dbConn = null;

    public static Connection dbConnect(){
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection dbConn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=H:/Integ Ongoing Project/_Midterm Project/Server/src/database/Database.accdb");
            return dbConn;
        }catch(Exception e){
            System.out.println(e.getMessage());
            return null;
        }
    }
}
4

2 回答 2

1

密码保留字。如果您必须将其保留为字段名称,请将其括在查询中的括号中,以减少混淆数据库引擎的可能性。

UPDATE Student
SET
    lastname = ?,
    firstname = ?,
    course = ?,
    yearlvl = ?,
    username = ?,
    [password] = ?
WHERE student_id = ?

请注意,正如斯蒂芬建议的那样,我包含了一个WHERE子句,因为您似乎不太可能希望将相同的字段值应用于表中的每一Student。我用作student_id表主键的占位符名称......唯一标识每一行的字段。我的意图是修改该WHERE子句以引用要更改其记录的学生的主键。

如果您实际上是在尝试添加新记录,而不是更新现有记录(或记录),请使用INSERT语句。

INSERT INTO Student (
    lastname,
    firstname,
    course,
    yearlvl,
    username,
    [password]
    )
VALUES (
    ?,
    ?,
    ?,
    ?,
    ?,
    ?
    )

如果您将自动编号作为主键的数据类型,则数据库引擎将为您管理它。

于 2013-02-08T18:37:37.930 回答
0

我认为问题在于您的 SQL 语句缺少 WHERE 子句。(我知道在 SQL 的某些方言中 WHERE 是可选的……但是在这里缺少 WHERE 对我来说毫无意义。)

我认为这是错误的原因是,即使 SQL 方言允许这样做,也不清楚您正在“设置”表的哪一行。即使 SQL 引擎可以弄清楚,WHERE 子句也可以让它更清晰。(在另一种情况下它“有效”的事实并不意味着它一定是正确的。)

可能导致问题的另一件事是“密码”是某些 SQL 方言中的保留字。更改列名,或对其进行转义。


最后,实际的 SQL 错误消息应该在异常堆栈跟踪中,或者在日志文件中失败。如果您试图在数据库代码中查找问题,那么这些应该是首先要查看的地方。寻找证据……而不是希望别人为你猜出正确的答案。

于 2013-02-08T16:02:01.220 回答