1

私はOracle Database 10g、Javaを使用しており、ResultSetを使用して新しい行を挿入しようとしています。

私は更新可能で方向に鈍感なResultSetのオブジェクトを持っています。つまり、どの方向にもトラバースできます。

moveToInsertRow、insertRow、およびセッター メソッドを使用して ResultSet に行を挿入すると、行はデータベースに挿入されますが、ResultSet をトラバースしている間、新しく挿入された行を表示できません。

誰でも私を助けることができますか?

私のコードは:

import java.sql.*;
import java.io.*;
import java.util.Date;
public class TestResultSet{

public static void main(String...args){
    try{
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/xe", "system", "admin");
        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery("Select EnrNo, Name, Gender, DOB From Student");
        int i;
        while(rs.next()){
            for(i = 1; i < 5; i++)
                System.out.print(rs.getString(i) + ", ");
            System.out.println();
        }

        //Inserting New Row
        rs.moveToInsertRow();
        rs.updateLong(1, 117020365276L);
        rs.updateString(2, "Ashfaq");
        rs.updateInt(3, 1);
        Date d = new Date();
        rs.updateDate(4, new java.sql.Date(d.getYear(), d.getMonth(), d.getDay()));
        rs.insertRow();
        //New Row Insertion ends here

        rs.first(); //Moving to first row
        do{
            for(i = 1; i < 5; i++)  //Index starts from 1, not from 0
                System.out.print(rs.getString(i) + ", ");
            System.out.println();
        }while(rs.next());
    }
    catch(SQLException ex){ ex.printStackTrace(); }
    catch(Exception ex){ ex.printStackTrace(); }
}
}

/*
Student Table Schema
EnrNo Numeric(12) Primary Key
Name varchar2(25);
Gender Numeric(1);
DOB date
*/
4

4 に答える 4

1

問題は、データベースから復元された現在の行ではなく、新しい行がデータベースに追加されたことです。そのため、新しい行を認識するために、テーブルに対して別の読み取りを行う必要があります。非効率かもしれませんが(行数とクエリの複雑さに依存するため)、それが機能する方法です。

これを知っていると、コードは次のようになります。

ResultSet rs = stmt.executeQuery("Select EnrNo, Name, Gender, DOB From Student");
int i;
while(rs.next()) {
    for(i = 1; i < 5; i++)
        System.out.print(rs.getString(i) + ", ");
    System.out.println();
}
//Inserting New Row
rs.moveToInsertRow();
rs.updateLong(1, 117020365276L);
rs.updateString(2, "Ashfaq");
rs.updateInt(3, 1);
Date d = new Date();
rs.updateDate(4, new java.sql.Date(d.getYear(), d.getMonth(), d.getDay()));
rs.insertRow();
//New Row Insertion ends here

//Moving to first row of the current recovered resultset
//thus not working as expected
//rs.first();

//close the resultset
rs.close();
//retrieve the rows from database again
rs = stmt.executeQuery("Select EnrNo, Name, Gender, DOB From Student");
do{
    for(i = 1; i < 5; i++)  //Index starts from 1, not from 0
        System.out.print(rs.getString(i) + ", ");
    System.out.println();
} while(rs.next());
于 2013-06-05T19:16:07.537 に答える
0

これを試して:

String query = "Select EnrNo, Name, Gender, DOB From Student";
try {
    conn = DriverManager.getConnection(DB_URL, USER, PASS); 
    // change this to reflect your specific situation
    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {                
        String EnrNo = rs.getString("EnrNo");
        String name = rs.getString("Name");
        String gender = rs.getString("Gender");
        String date = rs.getString("DOB");
        System.out.println(EnrNo + "\t" + name + "\t" + gender + "\t" + date);
    }
} catch (SQLException e) {
    e.printStackTrace();
}

// make sure you add these as your class variables:
Connection conn = null;
Statement stmt = null;
于 2013-06-05T18:20:37.720 に答える