更新java数据库中的记录值

时间:2017-02-25 14:13:29

标签: java sql jdbc

我在一个名为savings的类中有以下方法,我使用JDBC数据库在java应用程序上保存和更新。

我的数据库ZaiLab中有SAVINGS表,其中包含以下字段:     ID,ACCOUNTNUMBER,CUSTOMERNAME,BALANCE,MINMUM)

并且用户将使用JOPtionPane输入以下VALUE。     (ACC,金额);

然后应用程序应该检查用户输入的acco是否存在,如果不存在则应该显示相应的消息。 "帐户不存在"。如果存在,则应添加用户余额输入的金额。

问题是,它说没有列名为:BALANCE。

public void deposit(int acc,int Amount) {
    try {
        String host= "jdbc:derby://localhost:1527/ZaiLab";
        String uname= "siduduzo";
        String upass ="Password01";
        Connection con = DriverManager.getConnection( host, uname, upass );

        Statement stmt = con.createStatement( );

        if(Amount<1000) {
            JOptionPane.showMessageDialog( null,"Sorry! the Minimum you can deposit on a savings account is R1000");          
        } else {
            try (PreparedStatement checkAccountExists = con.prepareStatement("SELECT 1 FROM SAVINGS WHERE ACCOUNTNUMBER = ?")) {
                checkAccountExists.setInt(1, acc);

                try (ResultSet RS = checkAccountExists.executeQuery()) {
                    int currentbal = RS.getInt("BALANCE");
                    int newbalance = currentbal+Amount;

                    if (RS.next()) {
                        String sql = "UPDATE SAVINGS WHERE ACCOUNTNUMBER =" +acc+ "SET BALANCE = "+newbalance;
                        stmt.executeUpdate(sql);
                        JOptionPane.showMessageDialog( null,"you have made a deposit to "+acc);
                    } else {
                        JOptionPane.showMessageDialog( null,"Invalid Account Number");
                    }
                }
            }
        }
    } catch ( SQLException err ) {
        System.out.println( err.getMessage( ) );
    }
}

3 个答案:

答案 0 :(得分:1)

你开火的查询:

SELECT 1 FROM SAVINGS WHERE ACCOUNTNUMBER = ?

并使用以下命令填充参数标记的主变量

checkAccountExists.setInt(1, acc);

现在,如果您指定了现有帐号,则上面的查询将使用基础数据库用作列名的任何默认列名返回值1。它肯定不会是BALANCE。因此,您的结果集中没有该列。

如果SAVINGS表包含列BALANCE,您只需将con.prepareStatement的字符串参数中的查询更改为:

SELECT BALANCE FROM SAVINGS WHERE ACCOUNTNUMBER = ?

一般情况下:在测试Java代码之前 - 总是尝试使用普通的SQL客户端连接到底层数据库 - Oracle中的sqlplus,Vertica中的vsql,SQL Server中的isql等 - 并运行此类查询示例参数,查看返回的内容。然后,您自己发现了错误。

答案 1 :(得分:1)

如果您的数据库遵循ANSI标准,则当前UPDATE查询无效,因为WHERE子句必须遵循SET子句。此外,您需要正确分隔子句,因为现在SET对帐号是正确的。使用准备好的语句可以最好地实现这种语法:

UPDATE SAVINGS SET BALANCE = ? WHERE ACCOUNTNUMBER = ?

正如@MarkRotteveel解释的那样,在检查RS.next()以在成功的结果集查询中提前光标后,分配 currentbal newbalance 。考虑调整您的方法else阻止:

try (PreparedStatement checkAccountExists = con.prepareStatement(
        "SELECT BALANCE FROM SAVINGS WHERE ACCOUNTNUMBER = ?")) {
     checkAccountExists.setInt(1, acc);

     try (ResultSet RS = checkAccountExists.executeQuery()) {
          if (RS.next()) {
              int currentbal = RS.getInt("BALANCE");
              int newbalance = currentbal + Amount;

              try (PreparedStatement stmt = con.prepareStatement(
                    "UPDATE SAVINGS SET BALANCE = ? WHERE ACCOUNTNUMBER = ?")){ 

                   stmt.setInt(1, newbalance);
                   stmt.setInt(2, acc);

                   stmt.executeUpdate();
                   JOptionPane.showMessageDialog(null, "you have made a deposit to "+acc);
              }

          } else {
              JOptionPane.showMessageDialog(null, "Invalid Account Number");
          }
     }
}

答案 2 :(得分:0)

它将列中的所有记录更改为同一记录

sql = "SELECT * FROM department INNER JOIN employee ON department.depno=employee.depno  ";
resultSet = statement.executeQuery(sql); 

sql2="update employee set empage=? " ;  
ps=connection.prepareStatement(sql2);
while (resultSet.next()){  
    empage=resultSet.getInt("empage"); 
     if(empage>50){  l= empage-3; 
         //statement.executeUpdate(sql2); 
         ps.setInt(1,l);   
         ps.executeUpdate();
         ps.addBatch();
       }  
}