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

内側のクエリを初めて実行すると、同じ jdbc ステートメントを再利用しているため、外側のクエリからの結果セットが閉じられます。これを機能させるには、2 つの異なるステートメント オブジェクト インスタンスを使用する必要があります。

ただし、データベースに送り返すためだけに、そのすべてのデータをアプリケーションに戻す理由はまったくありません。次のようにすることもできます (構文はデータベース ベンダーによって若干異なる場合があります)。

"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 に答える
1

executeQueryを反復処理中に呼び出すことはできませんResultSet r。これにより、最初と が効果的にリセットさResultSetれ、Statement挿入が 1 つだけ行われます。修正するには、新しい を作成しますStatement

挿入executeUpdateには次を使用する必要があります。

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

2 番目のメソッドを呼び出すときに r が最後の行を指していることが原因である可能性があります。次の操作の前に r をリセットする必要がありますか?

于 2012-09-22T14:39:33.167 に答える