2014-09-02 29 views
0

这是我的问题: 我的问题是,我有dc作为变量,如果这个变量为null,那么应该执行其他部分。 但是这里的条件是当if()部分执行时它不会进入if(rs.next())?为什么? 当我的直流值是2时,rs.next()正在工作,但是当它是1时,它不工作。错误在rs.next()后if if else?

if (dc != null) { 
     rs = st.executeQuery("select e.env_id,s.* from env_mast e inner join" 
       + " db_server_mast s on e.dc_id=s.dc_id join cust_mast c on " 
       + "e.cust_id=c.cust_id where cust_name='" + env + "' and " 
       + "e.dc_id='" + dc + "' "); 
    } else { 

     System.out.println("Not DC"); 
     rs = st.executeQuery("select e.env_id,s.* from env_mast e inner join " 
       + "db_server_mast s on e.dc_id=s.dc_id join cust_mast c on " 
       + "e.cust_id=c.cust_id where cust_name='" + env + "' "); 

    } 
    if (rs.next()) { 
    } 
+2

可能是我或你的措辞很混乱。 :) – 2014-09-02 03:56:32

+1

可能是您的匹配条件没有记录 – 2014-09-02 04:08:07

回答

0

在我的理解中,您首先需要执行if-else。然后尝试执行另一个if-else这并不重要,那dc = 1dc = 2

如果我没有记错的话:

if (rs.next()) 

将只执行时dc = 2,所以在我看来,你的代码应该是像这样:

if(dc == null) { 
     System.out.println("Not DC"); 
     //do something when dc is null 
    } else { 
     System.out.println("Is DC"); 
     //do something when the dc is not null 
     for(int i = 0; i < dc; i ++) { 
      //something you perform in the if(rs.next()) { } 
     } 
    } 
1

我真的建议你使用PreapredStatement和绑定参数(或你的代码很容易受到SQL注入攻击),进一步我会通过建立查询开始。所以,像 -

String sql = "select e.env_id,s.* from env_mast e inner join " 
      + "db_server_mast s on e.dc_id=s.dc_id join cust_mast c on " 
      + "e.cust_id=c.cust_id where cust_name=?" 
      + ((dc != null) ? " and e.dc_id=?" : ""); 
try (PreparedStatement ps = conn.prepareStatement(sql);) { 
    ps.setString(1, env); 
    if (dc != null) { 
    ps.setString(2, dc); 
    } 
    try (ResultSet rs = ps.executeQuery();) { 
    while (rs.next()) { 
    } 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

感谢您的PreparedStatement推荐+1 – SparkOn 2014-09-02 04:14:25

+0

我同意PreparedStatement的概念。但它是将问题转移到其他方面(如性能)。他没有问任何与性能,安全有关的事情。他只是要求解决这个问题,并不期望任何代码改进。 – 2014-09-02 04:18:21

+0

@Rajacsp修复代码并不意味着未来问题的开放窗口 – SparkOn 2014-09-02 04:19:59

0

首先,最好是在使用查询,在此answer埃利奥特建议用事先准备好的声明。 如果你仍然想使用语句,那么你最好改变方法如下,以避免混淆和更好的代码维护。

String selectQuery = "select e.env_id,s.* from env_mast e inner join" 
       + " db_server_mast s on e.dc_id=s.dc_id join cust_mast c on " 
       + "e.cust_id=c.cust_id where cust_name='" + env + "' "; 

if (dc != null) 
{ 
    selectQuery += " and " 
       + "e.dc_id='" + dc + "' "; 
} 

rs = st.executeQuery (selectQuery); 
if (rs.next()) 
{ 
    .... 
} 

对于你的问题,

  1. 也许,没有在表env_mast时dc = 1没有记录。
  2. env_mast有记录,如果dc = 2

检查表中的数据表。

+0

我们应该避免使用Statement – SparkOn 2014-09-02 04:14:52

+0

@SparkOn:我同意。我建议用户,如果他们仍然想要使用语句,它是如何实现的。 – 2014-09-02 04:16:36

+0

第一件事从不建议声明第二件事从不建议声明第三件事从不建议声明 – SparkOn 2014-09-02 04:18:25