0

最初の while ループは 1 つのレコードのみを反復し、次に他の while ループは複数のレコードを反復しますが、最初の while ループは 2 番目以降のレコードへの参照を取得していません。私は2つの異なる結果セットオブジェクトと単一のステートメントオブジェクトを使用していますが、何か間違ったことをしていますか?

   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();
        }
    }
4

2 に答える 2

4

これが問題だと思います:

rs1 = stmt.executeQuery(mSQL);
// later...
rs = stmt.executeQuery(vSQL);

Statement2 つの同時クエリに同じものを使用しているようです。それが失敗したことに本当に驚かない。2 つの個別のStatement変数を使用します。理想的には、メソッド内で宣言された変数です。また:

  • finallyまた、例外がスローされた場合でもブロックを閉じることができるように、ブロック内のすべてを閉じる必要があります。
  • 次のようなコードではなく、パラメーター化された SQL を使用する必要があります。

    where e.em_controller_id='"+mDealer_id+"'"
    
  • N+1 クエリを実行するのではなく、結合を使用する必要があります
于 2012-12-12T06:53:50.697 に答える
2

Java API から:

デフォルトでは、Statement オブジェクトごとに 1 つの ResultSet オブジェクトのみを同時に開くことができます。したがって、ある ResultSet オブジェクトの読み取りが別の ResultSet オブジェクトの読み取りとインターリーブされている場合、それぞれが異なる Statement オブジェクトによって生成されている必要があります。Statement インターフェースのすべての実行メソッドは、開いているステートメントの現在の ResultSet オブジェクトが存在する場合、そのオブジェクトを暗黙的に閉じます。

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

于 2012-12-12T06:53:48.953 に答える