2012-06-19 59 views
1

我想在執行SQL插入時將標識列返回給我的java程序。運行代碼時出現以下錯誤:Java PreparedStatement RETURN_GENERATED_KEYS不能正常工作

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

在此先感謝 道格

+0

你能張貼相關的代碼的其他人呢?還請包括使用的數據庫。 – Everyone

+0

我爲您添加了更多我的代碼。我在websphere內部並連接到iseries上的IBM DB2數據庫。 – Doug

+0

什麼驅動程序?我沒有使用過DB2中的數據庫... – Everyone

回答

1

我的JT400.jar文件是舊版本。我從sourceforge下載了最新的jar文件,問題解決了。

2

假設參數/參數均衡

(請確認查詢本地執行,並且該驅動程序支持RETURN_GENERATED_KEYS),

你可以嘗試使用RETURN_GENERATED_KEYS作爲executeUpdate調用參數的一部分嗎?編輯: 只需閱讀關於使用DB2的說明。根據http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.java.doc%2Fsrc%2Ftpc%2Fimjcc_t0057053.html

_restriction:對於IBM Data Server Driver for JDBC和SQLJ版本3.57或更高版本,以下表單對於將行插入DB2®for z /OS®數據服務器的視圖無效。

各種Connection.prepareStatement(SQL語句, 是Statement.RETURN_GENERATED_KEYS); _

+0

我已經使用您的示例進行了測試,並且得到了相同的錯誤。 – Doug

+0

我沒有插入到視圖中。這是一個物理文件。 – Doug

+0

如果驅動程序支持RETURN_GENERATED_KEYS(它似乎是從您提到的備用執行路徑中完成的),那麼逐步調試似乎是唯一可行的選項 – Everyone

1

這種方式爲我的作品:

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

我曾經與Oracle數據庫在那裏,這不是一個問題如果表格有許多字段,則工作。 但是,即使有60個領域,上述工作對我來說也是如此。

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();