2012-06-19 3 views
1

Я пытаюсь получить столбец идентификатора, возвращенный в мою java-программу при выполнении вставки SQL. При запуске кода появляется следующая ошибка: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

Спасибо заранее Doug

+0

Не могли бы вы опубликовать остальную часть соответствующего кода? Также укажите базу данных. – Everyone

+0

Я добавил больше своего кода для вас. Я внутри websphere и подключаюсь к базе данных IBM DB2 на сервере. – Doug

+0

Какой драйвер? Я не использовал DB2 в aeons ... – Everyone

ответ

1

My JT400.jar файл был более ранней версии. Я загрузил последний файл jar из sourceforge, и проблема была решена.

2

Предполагая, что аргументы/параметры сбалансированы

(пожалуйста, подтвердите запрос выполняется изначально, и что драйвер поддерживает RETURN_GENERATED_KEYS),

Можете ли вы попытаться использовать RETURN_GENERATED_KEYS как часть аргумента для вызова executeUpdate?

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

EDIT: Просто читать вашу записку об использовании 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 для JDBC и SQLJ версии 3.57 или более поздней версии следующая форма недопустима для вставки строк в представление на сервере данных DB2® для 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

Try с Заявлении

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(); 
Смежные вопросы