我在一个名为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( ) );
}
}
答案 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();
}
}