while(rs1.next()) 不返回任何值
Posted
技术标签:
【中文标题】while(rs1.next()) 不返回任何值【英文标题】:while(rs1.next()) not returning any values 【发布时间】:2014-08-10 17:49:05 【问题描述】:public void addPhoneInvoice(String IMEI,String price,String name,
String pNumber) throws SQLException
con = GetConnection.GetConnection();
stmt = con.createStatement();
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date date = new Date();
String date1 = dateFormat.format(date);
this.price = Double.parseDouble(price);
String updatePhn = "DELETE FROM phonestock where IMEI = '"+IMEI+"'";
int j = stmt.executeUpdate(updatePhn);
if(j!=0)
String getDescriptionQuary = "SELECT PhoneName,WarrantyPeriod,YearORMonth FROM phonestock WHERE IMEI = '"+IMEI+"'";
ResultSet rs1 = stmt.executeQuery(getDescriptionQuary);
while(rs1.next())
this.phoneName = rs1.getString("PhoneName");
this.warranty = rs1.getInt("WarrantyPeriod");
this.yearOrMonth = rs1.getString("YearORMonth");
String addPhnTemp = "INSERT INTO invoiceTemp(Description,Date,IMEI,Price,Amount,ContactName,ContactNumber,Warranty,YearOrMonth) VALUES ('"+phoneName+"','"+date1+"','"+IMEI+"',"+price+","+price+",'"+name+"','"+pNumber+"',"+warranty+",'"+yearOrMonth+"')";
String addPhnPer = "INSERT INTO invoicepermanent(Description,Date,IMEI,Price,Amount,ContactName,ContactNumber,Warranty,YearOrMonth) VALUES ('"+phoneName+"','"+date1+"','"+IMEI+"',"+price+","+price+",'"+name+"','"+pNumber+"',"+warranty+",'"+yearOrMonth+"')";
int i = stmt.executeUpdate(addPhnTemp);
i = stmt.executeUpdate(addPhnPer);
if(i != 0)
JOptionPane.showMessageDialog(null,"Success");
else
JOptionPane.showMessageDialog(null,"Error");
这显示成功,但 phoneName
、warranty
和 yearOrMonth
未从数据库返回。
【问题讨论】:
好吧,你怎么知道你的查询实际上返回了你期望的结果?您是否在应用程序之外运行它? 您在选择之前已删除记录。不是吗? 只是一个建议,你不应该写像String updatePhn = "DELETE FROM phonestock where IMEI = '"+IMEI+"'";
这样的查询,它会使代码容易被SQLinjection导致未经授权的访问你的数据库,改用preparedstatement
。
【参考方案1】:
因为 executeUpdate 返回受影响的行数。如果大于 0,则表示没有删除任何内容,并且您正在检查相同的 IMEI,但该 IMEI 已消失。因此,如果你说 `System.err.println(rs1.isLast());它将返回 true,因为您的 select 语句没有找到任何行。
【讨论】:
现在做一个好网民,为所有有帮助的答案投票?【参考方案2】:不要认为这些INSERT
查询执行成功。 Date
是 mysql 的保留字。在它周围加上一些引号。
这里是所有Reserved Words in MySQL 5.5.40的列表
【讨论】:
提示在所有数据库名称上添加尾随下划线。示例:date_
。 SQL 规范明确承诺从不使用尾随下划线。因此,将它附加到您的所有名称意味着您永远不必担心与标准 SQL 和数据库系统中的所有各种扩展使用的一千多个关键字和保留字发生冲突。请参阅此partial list of several hundred。 my answer 的更多信息关于另一个问题。
哎呀,我评论中的那个 URL 应该是 drupal.org/node/141051。此外,this question 讨论了 SQL 中的各种保留字列表以及各种数据库实现。以上是关于while(rs1.next()) 不返回任何值的主要内容,如果未能解决你的问题,请参考以下文章
If语句在While True循环(Python)中返回False