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 = ?

Stephenが提案したように、テーブルのすべての行にWHERE同じフィールド値を適用することはほとんどないように思われるため、句を含めたことに注意してください。テーブルの主キーのプレースホルダー名として使用しました...各行を一意に識別するフィールド。私の意図は、レコードを変更したい学生の主キーを参照するように条項を改訂することです。Studentstudent_idWHERE

実際に新しいレコードを追加しようとしている場合は、既存の1つまたは複数のレコードを更新する代わりに、INSERTステートメントを使用します。

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

また、主キーのデータ型として自動番号が設定されている場合は、dbエンジンがそれを管理します。

于 2013-02-08T18:37:37.930 に答える
0

問題は、SQL ステートメントに WHERE 句がないことだと思います。(SQL の一部の方言では WHERE がオプションであることは知っていますが、WHERE が欠落していると意味がありません。)

これが間違っていると私が思う理由は、SQL ダイアレクトでこれが許可されていても、テーブルのどの行を「設定」しているかが明確でないためです。SQL エンジンがそれを把握できたとしても、WHERE 句を使用するとより明確になります。(そして、それが他のケースで「機能する」という事実は、それが必ずしも正しいという意味ではありません。)

問題の原因となる可能性のあるもう 1 つのことは、「パスワード」が一部の SQL 方言の予約語であることです。列名を変更するか、エスケープしてください。


最後に、実際の SQL エラー メッセージ、例外スタック トレースにあるか、ログ ファイルに失敗している必要があります。データベース コードの問題を見つけようとしている場合は、これらを最初に確認する必要があります。他の誰かがあなたに正しい答えを推測してくれることを期待するのではなく、証拠を探してください。

于 2013-02-08T16:02:01.220 に答える