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;
}
}
}
答案 0 :(得分:1)
密码是reserved word。如果必须将其保留为字段名称,请将其括在查询的括号中,以减少混淆数据库引擎的可能性。
UPDATE Student
SET
lastname = ?,
firstname = ?,
course = ?,
yearlvl = ?,
username = ?,
[password] = ?
WHERE student_id = ?
注意我在Stephen建议中包含了一个WHERE
子句,因为您似乎不太可能希望将相同的字段值应用于Student
表中的每个行。我使用student_id
作为表的主键的占位符名称...唯一标识每一行的字段。我的目的是修改WHERE
子句以引用要更改其记录的学生的主键。
如果您实际上是在尝试添加新记录,而不是更新现有记录(或记录),请使用INSERT
语句。
INSERT INTO Student (
lastname,
firstname,
course,
yearlvl,
username,
[password]
)
VALUES (
?,
?,
?,
?,
?,
?
)
如果您将自动编号作为主键的数据类型,则数据库引擎将为您管理它。
答案 1 :(得分:0)
我认为问题是您的SQL语句缺少WHERE子句。 (我知道在某些SQL方言中WHERE是可选的......但是缺少WHERE对我来说没有任何意义。)
我认为这是错误的原因是,即使SQL方言允许这样做,也不清楚表中哪个行是“设置”。即使SQL引擎可以解决它,WHERE子句使它更清晰。 (而且它在另一种情况下“有效”的事实并不意味着它必然是正确的。)
另一个可能导致问题的原因是“密码”是某些SQL方言中的保留字。更改列名称,或将其转义。
最后,实际的SQL错误消息应该在异常堆栈跟踪中,或者在日志文件中失败。如果您试图在数据库代码中查找问题,那么应该是第一个位置。寻找证据 ...而不是希望别人为您猜出正确的答案。