簡體   English   中英

錯誤:ORA-00900 SQLStatement無效,但語句仍按預期運行

[英]Error: ORA-00900 Invalid SQLStatement but statement still works as intended

我創建了一個可以更改和從數據庫檢索數據的GUI。 但是,即使任務已完成,某些按鈕也會引發SQLException。 (例如,它會給我一個錯誤,但仍然可以正確地插入數據庫中。

這是我的代碼:

String sqlUser = e.getActionCommand();
String sql;
PreparedStatement stmt;
try{
    if(sqlUser.equals("Save Record"))
                {
                    ResultSet rs;
                    sql = "INSERT INTO table_name (name, ID, result, date, date2) values (?,?,?,?,?)";
                    stmt = con.prepareStatement(sql);
                    stmt.setString(1, textField.getText());
                    stmt.setInt(2, Integer.parseInt(textField_1.getText()));
                    stmt.setString(3, textField_2.getText());
                    stmt.setDate(4, new java.sql.Date(System.currentTimeMillis()));
                    stmt.setDate(5, new java.sql.Date(System.currentTimeMillis()));
                    rs = stmt.executeQuery();
                    updateUI(rs);
                    con.commit();
                }
    else if(sqlUser.equals("Save Update"))
                {
                    ResultSet rs;
                    sql = "UPDATE table_name SET result = ? , date = ?, date2 = ? WHERE name = ? AND ID = ?";
                    stmt = con.prepareStatement(sql);
                    stmt.setString(4, textField.getText());
                    stmt.setInt(5, Integer.parseInt(textField_1.getText()));
                    stmt.setString(1, textField_2.getText());
                    stmt.setDate(2, new java.sql.Date(System.currentTimeMillis()));
                    stmt.setDate(3, new java.sql.Date(System.currentTimeMillis()));
                    rs = stmt.executeQuery();
                    updateUI(rs);
                    con.commit();
                }
} catch (SQLException err)
{
    JOptionPane.showMessageDialog(null,err.getMessage());
}

updateUI方法如下:

public void updateUI(ResultSet rs)
    {
        try
        {
            String strCDate = dateFormat.format(rs.getDate("date"));
            String strLADate = dateFormat.format(rs.getDate("date2"));

            textField.setText(rs.getString("name"));
            textField_1.setText(Integer.toString(rs.getInt("ID")));
            textField_2.setText(rs.getString("result"));
            lblCalculationDate.setText("Date: " + strCDate);
            lblLastAccessDate.setText("Date2: " + strLADate);
        }
        catch(SQLException err)
        {
            JOptionPane.showMessageDialog(null,err.getMessage());
        }
    }

DateFormat是這樣的(不要認為它太重要了):

private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  • 刪除con.commit(); 因為默認情況下數據庫連接是自動提交的。
  • 僅當設置con.setAutoCommit(false);時,才可以使用commit() con.setAutoCommit(false);
  • 插入執行不返回resultSet,因此刪除rs = stmt.executeQuery(); 而是更改updateUI方法以接受兩個日期作為參數

完整的新代碼:

    String sqlUser = e.getActionCommand();
    String sql;
    PreparedStatement stmt;
    try{
        int id = Integer.parseInt(textField_1.getText());
        java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
                        java.sql.Date date2 = new java.sql.Date(System.currentTimeMillis());
        if(sqlUser.equals("Save Record"))
                    {
                        ResultSet rs;

                        sql = "INSERT INTO table_name (name, ID, result, date, date2) values (?,?,?,?,?)";
                        stmt = con.prepareStatement(sql);
                        stmt.setString(1, textField.getText());
                        stmt.setInt(2, id);
                        stmt.setString(3, textField_2.getText());
                        stmt.setDate(4,date );
                        stmt.setDate(5,date2);
                        // OLD: rs = stmt.executeQuery();
                        // OLD: updateUI(rs);
                        stmt.executeUpdate();
                        updateUI(id,  textField.getText(),textField_2.getText(),date,date2 );
                        // OLD: con.commit();
                    }
        else if(sqlUser.equals("Save Update"))
                    {
                        ResultSet rs;
                        sql = "UPDATE table_name SET result = ? , date = ?, date2 = ? WHERE name = ? AND ID = ?";
                        stmt = con.prepareStatement(sql);
                        stmt.setString(4, textField.getText());
                        stmt.setInt(5, id);
                        stmt.setString(1, textField_2.getText());
                        stmt.setDate(2, date);
                        stmt.setDate(3, date2);
                        // OLD: rs = stmt.executeQuery();
                        // OLD: updateUI(rs);
                        stmt.executeUpdate();
                        updateUI(id,  textField.getText(),textField_2.getText(),date,date2 );
                        // OLD: con.commit();
                    }
    } catch (SQLException err)
    {
        JOptionPane.showMessageDialog(null,err.getMessage());
    }

The updateUI method is as follows:

    public void updateUI(int id, String name, String result, Date date, Date date2)
        {
            try
            {
                String strCDate = dateFormat.format(date);//rs.getDate("date"));
                String strLADate = dateFormat.format(date2);//rs.getDate("date2"));

                textField.setText(name);//rs.getString("name"));
                textField_1.setText(id+"");//Integer.toString(rs.getInt("ID")));
                textField_2.setText(result);//rs.getString("result"));
                lblCalculationDate.setText("Date: " + strCDate);
                lblLastAccessDate.setText("Date2: " + strLADate);
            }
            catch(SQLException err)
            {
                JOptionPane.showMessageDialog(null,err.getMessage());
            }
        }

對於插入和更新,您應該使用

stmt.execute(); rs = stmt.getResultSet();

要么

stmt.executeUpdate(); rs = stmt.getResultSet();

另外,由於您沒有設置con.setAutoCommit(false)因此不需要con.commit()

不相關的旁注:作為最佳實踐,您應該避免在Java代碼中對SQL進行硬編碼

暫無
暫無

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

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