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");
       

这显示成功,但 phoneNamewarrantyyearOrMonth 未从数据库返回。

【问题讨论】:

好吧,你怎么知道你的查询实际上返回了你期望的结果?您是否在应用程序之外运行它? 您在选择之前已删除记录。不是吗? 只是一个建议,你不应该写像String updatePhn = "DELETE FROM phonestock where IMEI = '"+IMEI+"'";这样的查询,它会使代码容易被SQLinjection导致未经授权的访问你的数据库,改用preparedstatement 【参考方案1】:

因为 executeUpdate 返回受影响的行数。如果大于 0,则表示没有删除任何内容,并且您正在检查相同的 IMEI,但该 IMEI 已消失。因此,如果你说 `System.err.println(rs1.isLast());它将返回 true,因为您的 select 语句没有找到任何行。

【讨论】:

现在做一个好网民,为所有有帮助的答案投票?【参考方案2】:

不要认为这些INSERT 查询执行成功。 Datemysql 的保留字。在它周围加上一些引号。

这里是所有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()) 不返回任何值的主要内容,如果未能解决你的问题,请参考以下文章

E8邮件代码

sqlsrv_num_rows 不返回任何值

If语句在While True循环(Python)中返回False

Python Mysqldb 为位值返回 '\x01'

有没有办法在 Ruby 中使用带有任何方法的 while 循环来执行冒泡排序算法?

第十节,While循环