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

3 回答 3

1

executeQuery遍历ResultSet r. 这将有效地重置您的第一个ResultSet以及您的Statement,从而只制作一个插入。要修复,请创建一个新的Statement.

对于插入executeUpdate应该使用:

stmt2.executeUpdate("insert into ApprovedLeave values('"+empid+"','"+leave+"','True')");
于 2012-09-22T14:30:13.457 回答
1

当您第一次执行内部查询时,它会关闭外部查询的结果集,因为您正在重新使用相同的 jdbc 语句。为此,您需要使用两个不同的语句对象实例。

但是,实际上没有理由将所有这些数据拉回应用程序,而只是将其发送回数据库。您可以执行以下操作(语法可能因数据库供应商而略有不同):

"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 变量绑定到语句

于 2012-09-22T14:36:45.063 回答
0

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

于 2012-09-22T14:39:33.167 回答