0

JTable からデータベースにデータを書き込みたいのですが、今のところうまくいきません。常に mysql エラーが発生します。誰かが私に何が悪いのか教えてもらえますか?

public class Fussball extends JFrame {

    private JButton save = new JButton();
    private JTable jTable1 = new JTable(9, 4);
    private DefaultTableModel jTable1Model = (DefaultTableModel) jTable1.getModel();
    private JScrollPane jTable1ScrollPane = new JScrollPane(jTable1);

    public Fussball(String title) {
        super(title);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        int frameWidth = 563;
        int frameHeight = 482;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2;
        setLocation(x, y);
        Container cp = getContentPane();
        cp.setLayout(null);
        // Anfang Komponenten
        save.setBounds(200, 304, 201, 65);
        save.setText("speichern");
        save.setMargin(new Insets(2, 2, 2, 2));
        save.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                save_ActionPerformed(evt);
            }
        });
        cp.add(save);
        jTable1ScrollPane.setBounds(64, 48, 465, 225);
        jTable1.getColumnModel().getColumn(0).setHeaderValue("Spiel ID");
        jTable1.getColumnModel().getColumn(1).setHeaderValue("Verein 1");
        jTable1.getColumnModel().getColumn(2).setHeaderValue("Verein 2");
        jTable1.getColumnModel().getColumn(3).setHeaderValue("Ergebnis");
        cp.add(jTable1ScrollPane);
        // Ende Komponenten
        setResizable(false);
        setVisible(true);
    }

    public void save_ActionPerformed(ActionEvent evt) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", "");
            Statement statement = dbConn.createStatement();
            String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)";
            PreparedStatement ps = dbConn.prepareStatement(insertQuery);
            ps.setString(1, "idSpiel");
            ps.setString(2, "Vereinone");
            ps.setString(3, "Vereintwo");
            ps.setString(4, "Ergebnis");
            ps.executeUpdate();
            //Vector vector = new Vector();
            statement.close();
            dbConn.close();
        } catch (InstantiationException e) {
            System.err.println("Error in Instantiation!");
        } catch (ClassNotFoundException e) {
            System.err.println("Class not found!");
        } catch (IllegalAccessException e) {
            System.err.println("Access denied!");
        } catch (SQLException e) {
            System.err.println("SQL Error!");
        }

    }

    public static void main(String[] args) {
        new Fussball("fussball");
    }
}
4

3 に答える 3

0

私が間違っていない場合、あなたが使用しているステートメントは間違っています:

private final String INSERT_QUERY=
"INSERT INTO tableName (col_name,col_name2, col_name3) VALUES(?, ?, ?);";

値に関連付ける列の名前がありません。

Eddited:上記は誤りです。あなたの発言と私の発言はどちらも正しいです。

また、INSERTステートメントを使用している場合は、次のようにすることができます(ステートメントを作成する必要はありません)。

PreparedStatement p = dbConn.prepareStatement(INSERT_QUERY);
p.setString(...);

などなど。

それでも問題が解決しない場合は、MySQLサーバーの電源がオフになっている(実行されていない)可能性があるという事実もあります(これは私に何度も起こりました)。最初に実行されていることを確認してください。

何も機能しない場合は、少なくとも、発生しているエラーをお知らせください。

于 2013-03-14T17:44:12.720 に答える
0

MYSQL JDBC ドライバーを含むフォルダーに設定Classpathして、アプリケーションを再実行してみてください

于 2013-03-14T17:42:29.103 に答える
0

データベース機能を UI コードから分離するようにしてください。リスナーメソッドが実行しているのと同じように、挿入を実行する簡単なメソッドを作成し、それが機能するかどうかを確認してください。投稿したコードは実際にはテーブルからデータを取得しないため、ほとんどそうしています。テスト更新を実行するだけのようです。それでも、UI コードと混合するのではなく、DAO クラスを作成し、そこにすべての SQL コードを配置することをお勧めします。

SQL からのエラー メッセージは常に役立つとは限りませんが、役立つ場合もあります。コード内の例外を無視しています。

特に、コードの catch ブロックを次のように置き換えます。

 catch (SQLException e) {
        System.err.println("SQL Error:" + e.toString() );
 }

Statement statement = dbConn.createStatement();また、 your を使用していないため、その行を削除するだけでよいことに注意してください。

DAO クラス内で、このようなテスト メソッドを作成して、この問題を特定してトラブルシューティングすることができます。例外メッセージをキャッチして独自のメッセージを出力するだけでなく、例外メッセージを表示することが重要です。

 public void testDBInsert() {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", "");
        String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)";
        PreparedStatement ps = dbConn.prepareStatement(insertQuery);
        ps.setInt(1, 128);  //should be an integer?
        ps.setString(2, "Vereinone");
        ps.setString(3, "Vereintwo");
        ps.setString(4, "Ergebnis");
        ps.executeUpdate();
        ps.close();
        dbConn.close();
    } catch (Exception e) {
        System.err.println("Error in SQL Test: " + e.toString() );
    } 
}
于 2013-03-14T17:33:37.510 に答える