JDBC中的常规错误(更新数据库)

时间:2013-02-08 15:42:35

标签: java ms-access jdbc odbc

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;
        }
    }
}

2 个答案:

答案 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错误消息应该在异常堆栈跟踪中,或者在日志文件中失败。如果您试图在数据库代码中查找问题,那么应该是第一个位置。寻找证据 ...而不是希望别人为您猜出正确的答案。