![](/img/trans.png)
[英]Why does this Cloudant java api code not update existing database record?
[英]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()
之后分配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");
}
}
}
它將列中的所有記錄更改為同一記錄
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.