1

SQL 挿入を行うときに、ID 列を Java プログラムに返そうとしています。コードを実行すると、次のエラーが表示されます

    Uncaught exception thrown in one of the service methods of the 
servlet: Cocoon. Exception thrown : java.lang.AbstractMethodError: java/sql
/Connection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;

これが私が実行しているコードです。

private void insertUserInputParameters(ReportData rptData){

     UserInputParameters userParams = rptData.getUserInputData();
     StringBuilder sql = new StringBuilder();
     PreparedStatement pstmt = null;
     ResultSet rs = null;
     int userDataId = -1;

    //Get a database connection.
    sl = ServiceLocator.getInstance();
    ds = sl.getDataSource("jdbc/collegeguide");
    con = ds.getConnection();
    con.setReadOnly(false);

    sql.append("insert into cpgusrdtaf (statecd, addr1, addr2, city, state, ");
    sql.append("zipcode, dependent, shdindic, marstatus, residency, prntatge, ");
    sql.append("fincome, mincome, pincome, taxspaid, taxreturn, elig1040, ");
    sql.append("gincome, pcash, inetwrth, bnetwrth, pbenefit, paddlinf, ");
    sql.append("puntax, pdslcwrk, smstatus, sresidncy, studtr, stud1040, ");
    sql.append("sadjinc, sincome, spincome, sdslcwrk, studtax, scash, ");
    sql.append("sinvest, snetwrth, saddlinf, suntax, househld, nmbrsch, ");
    sql.append("studact, studsat, schools, housing) ");
    sql.append("values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ");
    sql.append("?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

    //This line of code is where I get the error**
    pstmt = con.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);

    //If I remove the 'Statement.RETURN_GENERATED_KEYS' I do not get the error.**
    pstmt = con.prepareStatement(sql.toString());

    setStatementValues(pstmt, userParams);
    pstmt.executeUpdate();

    rs = pstmt.getGeneratedKeys();
    if(rs.next()){
       userDataId = rs.getInt(1);
    }

私はストアド プロシージャを使用することを許可されていないため、そのルートに進むことはできません。どんな助けでも大歓迎です

私はJava 1.5を使用しています

よろしくお願いします ダグ

4

4 に答える 4

3

引数/パラメータのバランスが取れていると仮定する

(クエリがネイティブに実行されること、およびドライバーが RETURN_GENERATED_KEYS をサポートしていることを確認してください)、

executeUpdate 呼び出しの引数の一部として RETURN_GENERATED_KEYS を使用できますか?

pstmt = con.createStatement();
pstmt.executeUpdate(sql.toString(), Statement.RETURN_GENERATED_KEYS);

編集:DB2の使用に関するメモを読んでください。http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.java.doc%2Fsrc%2Ftpc%2Fimjcc_t0057053.htmlによると

_制限: IBM Data Server Driver for JDBC and SQLJ バージョン 3.57 以降の場合、DB2® for z/OS® データ・サーバー上のビューに行を挿入する場合、以下の形式は無効です。

Connection.prepareStatement(sql-statement, Statement.RETURN_GENERATED_KEYS);_

于 2012-06-19T17:34:26.503 に答える
2

このように私にとってはうまくいきます:

prepStmt = con.prepareStatement(sql, new String[]{"NameOfIDField"});

テーブルに多くのフィールドがある場合、これが機能しないOracleデータベースで問題が発生したことがあります。しかし、上記は60フィールドでも機能しています。

于 2012-06-20T06:48:59.673 に答える
1

私の JT400.jar ファイルは古いバージョンでした。sourceforge から最新の jar ファイルをダウンロードしたところ、問題は解決しました。

于 2013-01-08T17:44:38.370 に答える
0

ステートメントで試してください

Statement st    = null;
ResultSet rs    = null;
st = con.createStatement();

String query = " INSERT INTO refac_folios
([usuario], [estatus]) VALUES ('" + usuario + "'," + Vista_FoliosRefacciones.ESTATUS_CREADO )" ;

Integer afectadas = st .executeUpdate( query, Statement.RETURN_GENERATED_KEYS );

if (afectadas > 0){

     rs = st.getGeneratedKeys();

     if (rs .next()) {
          folio = rs.getInt(1);
     }
  rs.close();
}
st.close();
于 2015-02-17T16:34:09.520 に答える