簡體   English   中英

預備帳單數據庫

[英]Prepared Statement Database

我想將數據從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");
    }
}

嘗試將數據庫功能與UI代碼隔離開。 就像編寫偵聽器方法一樣,只需編寫一個簡單的方法來運行插入,然后看能否使它工作即可。 您現在幾乎要這樣做了,因為您發布的代碼實際上並沒有從表中提取數據。 看起來它只是運行測試更新。 盡管如此,我還是建議您創建一個DAO類,並將所有SQL代碼放在此處,而不要與UI代碼混在一起。

來自SQL的錯誤消息並不總是那么有用,但有時卻很有幫助。 您將忽略代碼中的異常。

特別是,我將用以下代碼替換代碼中的catch塊:

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

還要注意,您沒有使用Statement statement = dbConn.createStatement(); 因此您可以刪除該行。

在您的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() );
    } 
}

嘗試將Classpath設置為包含MYSQL JDBC驅動程序的文件夾,然后重新運行您的應用程序

如果我沒記錯的話,那么您使用的語句是錯誤的:

 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服務器可能已關閉(未運行)。 檢查它首先運行。

如果沒有辦法,您至少可以嘗試將您遇到的錯誤告訴我們嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM