Java 无法在单个函数中迭代两个while循环

Java 无法在单个函数中迭代两个while循环,java,jdbc,Java,Jdbc,第一个while循环只遍历一个记录,然后另一个while循环get遍历多个记录,但第一个while循环没有获得对第二个记录的引用或进一步的引用。我使用了两个不同的结果集对象和一个语句对象。如果我做错了什么,请回复并提前感谢 public void generateCsvFile() { String vSQL = ""; String mSQL = ""; String mDealer_id = ""; try

第一个while循环只遍历一个记录,然后另一个while循环get遍历多个记录,但第一个while循环没有获得对第二个记录的引用或进一步的引用。我使用了两个不同的结果集对象和一个语句对象。如果我做错了什么,请回复并提前感谢

   public void generateCsvFile()
   {
       String vSQL = "";
       String mSQL = "";
       String mDealer_id = "";
        try
        {
            //mSQL = "mSQL"
            mSQL = "select distinct em_controller_id as dealer_id from entity_master";
            System.out.println("mSQL :: \n"+mSQL);
            rs1 = stmt.executeQuery(mSQL);

            while(rs1.next())
            {           

                //System.out.println("@#@# Dealer id @##@#::"+rs1.getString("dealer_id"));
                mDealer_id = rs1.getString("dealer_id");
                vSQL = "select e.em_entity_id,e.em_name,e.em_address_line_1,e.em_address_line_2,e.em_address_line_3,e.em_phone_no_1,e.em_phone_no_2,e.em_dob,e.em_pan_no,e.em_exch_client_id from entity_master e where e.em_controller_id='"+mDealer_id+"'";   
                System.out.println("vSQL :: \n"+vSQL);
                rs = stmt.executeQuery(vSQL);

                FileWriter writer = new FileWriter(mDealer_id+".csv");

                while(rs.next())
                {

                    System.out.println("em_entity_id !@!@!('"+mDealer_id+"') :: "+rs.getString("em_entity_id"));
                    System.out.println("ENTITY :: "+rs.getString("em_entity_id"));
                    writer.append(rs.getString("em_entity_id"));
                    writer.append(',');
                    writer.append(rs.getString("em_name"));
                    writer.append(',');
                    writer.append(rs.getString("em_address_line_1"));
                    writer.append(',');
                    writer.append(rs.getString("em_address_line_2"));
                    writer.append(',');
                    writer.append(rs.getString("em_address_line_3"));
                    writer.append(',');
                    writer.append(rs.getString("em_phone_no_1"));
                    writer.append(',');
                    writer.append(rs.getString("em_phone_no_2"));
                    writer.append(',');
                    writer.append(rs.getString("em_dob"));
                    writer.append(',');
                    writer.append(rs.getString("em_pan_no"));
                    writer.append(',');
                    writer.append(rs.getString("em_exch_client_id"));
                    writer.append('\n');
                }
                rs.close();
//              //generate whatever data you want
                writer.flush();
                writer.close();

            }
            rs1.close();

        }
        catch(Exception e)
        {
             e.printStackTrace();
        }
    }
从Java API:

默认情况下,每个语句对象只能创建一个ResultSet对象 同时打开。因此,如果读取一个结果集 对象与另一个对象的读取交错,每个对象必须 由不同的语句对象生成。中的所有执行方法 语句接口隐式关闭语句的当前结果集 对象(如果存在打开的对象)

来自Java API:

默认情况下,每个语句对象只能创建一个ResultSet对象 同时打开。因此,如果读取一个结果集 对象与另一个对象的读取交错,每个对象必须 由不同的语句对象生成。中的所有执行方法 语句接口隐式关闭语句的当前结果集 对象(如果存在打开的对象)


我怀疑这就是问题所在:

rs1 = stmt.executeQuery(mSQL);
// later...
rs = stmt.executeQuery(vSQL);
看起来您对两个并发查询使用了相同的
语句。我对这一失败并不感到惊讶。使用两个独立的
语句
变量-理想情况下,是在方法中声明的变量。此外:

  • 您还应该关闭
    finally
    块中的所有内容,这样即使引发异常,您仍然可以关闭它们
  • 您应该使用参数化SQL,而不是这样的代码:

    where e.em_controller_id='"+mDealer_id+"'"
    
  • 您应该使用联接,而不是执行N+1查询

    • 我怀疑这就是问题所在:

      rs1 = stmt.executeQuery(mSQL);
      // later...
      rs = stmt.executeQuery(vSQL);
      
      看起来您对两个并发查询使用了相同的
      语句。我对这一失败并不感到惊讶。使用两个独立的
      语句
      变量-理想情况下,是在方法中声明的变量。此外:

      • 您还应该关闭
        finally
        块中的所有内容,这样即使引发异常,您仍然可以关闭它们
      • 您应该使用参数化SQL,而不是这样的代码:

        where e.em_controller_id='"+mDealer_id+"'"
        
      • 您应该使用联接,而不是执行N+1查询

      您正在使用哪个数据库,是否存在任何特定错误?只有一条Select语句并连接所需的表会更有意义。但我不确定你是从哪里得到数据的。你能告诉我们初始化stmt的代码吗?(请记住删除连接字符串(如果有)。您使用的数据库是否存在任何特定错误?只使用1条Select语句并连接所需的表更为合理。但我不确定您从何处获取数据。能否向我们显示初始化stmt的代码?(如果有,请记住删除连接字符串)。