2012-09-22 46 views
0

我从表EmployeeLeave中提取记录并将其存储在结果集中。然后我将这个结果集插入数据库表中,但是我只能插入结果集的第一行而不是所有的行。
我如何插入结果集的所有行?插入查询仅插入数据库表中结果集的第一行

r = stmt.executeQuery("select * from EmployeeLeave where EmployeeNo='"+empno+"'"); 
while(r.next()) 
{ 
    for(int i=0;i<=r.getRow();i++) 
    { 
     int empid = r.getInt(1); 
     String leave = r.getString(2); 
     r = stmt.executeQuery("insert into ApprovedLeave values('"+empid+"','"+leave+"','True')"); 
    } 
} 
+0

如果您正在学习Java,请以良好的方式学习并使用PreparedStatement而不是Statement。这里有两篇文章要阅读:[为什么预备陈述很重要,以及如何正确使用它们](http://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how - 正确使用它们)和[使用准备好的语句](http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)。 –

回答

1

不能调用executeQuery,同时通过ResultSetr迭代。这将有效地重置您的第一个ResultSet以及您的Statement,导致只有一个插入。要修复,请创建一个新的Statement。重新使用相同的JDBC声明

stmt2.executeUpdate("insert into ApprovedLeave values('"+empid+"','"+leave+"','True')"); 
+0

我已经尝试过不同的结果集,但它再次只插入第一行 – user1690973

+0

AFAIK您还需要创建一个新语句。 – Reimeus

+0

嘿谢谢!它的工作现在.. :) – user1690973

1

当你执行首次内部quert,它关闭的结果,从外部查询设置,因为你:

对于插入executeUpdate应该被使用。为此,您需要使用两个不同的语句对象实例。

但是,真的没有理由将所有数据都回收到应用程序,只是将其发送回数据库。你可能只是做类似(语法可能会因数据库供应商略有不同):

"insert into ApprovedLeave select EmployeeNo, leave, 'True' from EmployeeLeave where EmployeeNo = '" + empno + "'" 

甚至更​​好,但将与一个PreparedStatement:

"insert into ApprovedLeave select EmployeeNo, leave, 'True' from EmployeeLeave where EmployeeNo = ?" 

,你那么你的EMPNO变量绑定到声明

0

这可能是因为当您调用第二种方法时,r指向最后一行。你需要在下一次操作之前重置r吗?

+0

这是一个有效的答案,但你应该付出更多的努力。阅读[什么是可接受的答案?](http://meta.stackexchange.com/a/118694/182862)以获取更多信息,特别是从第8点到第11点。 –

相关问题