簡體   English   中英

更新Java數據庫中的記錄值

[英]Update a record value in java database

我在名為save的類中具有以下方法,正在使用JDBC數據庫在java應用程序上進行保存和更新。

我的數據庫ZaiLab中有SAVINGS表,其中包含以下字段,ID,ACCOUNTNUMBER,CUSTOMERNAME,BALANCE,MINMUM)

用戶將使用JOPtionPane輸入以下值。 (acc,Amount);

然后,應用程序應檢查用戶輸入的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( ) );
    }
}

您觸發的查詢會:

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等-並使用示例參數運行這樣的查詢,看看會回來什么。 然后,您將自己發現錯誤。

當前,如果數據庫遵循ANSI標准,則UPDATE查詢無效,因為WHERE子句必須遵循SET子句。 此外,由於SET現在與帳號相對應,因此您需要適當地分隔條款。 可以通過准備好的語句來最好地實現這種語法:

UPDATE SAVINGS SET BALANCE = ? WHERE ACCOUNTNUMBER = ?

就像@MarkRotteveel解釋的那樣,在檢查RS.next()之后分配currentbalnewbalance以在成功的結果集查詢中前進游標。 考慮調整方法的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");
          }
     }
}

它將列中的所有記錄更改為同一記錄

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

暫無
暫無

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

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