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