2013-10-09 17 views
5

Voglio inserire i dati nel database Oracle 11g e inserisco i dati utilizzando il campo di input i dati entrano nella base dati ma solo id coulmn e un'altra stringa coulmn sono ottenere dati corretti ma un altro coulmn ottenere null o 0, quindi non posso risolvere questo problema e in fase di esecuzione non ho questo erroreTipo di colonna non valido: getInt non implementato per la classe oracle.jdbc.driver.T4CRowidAccessor

Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor

questo è il mio codice

public Client newClient(Client client){ 
    try { 
     con = DBConnection.getConnection(driver, url, name, pass);  
     pstmt = con.prepareStatement("INSERT INTO CLIENT (CID, FIRSTNAME, LASTNAME, CAREER, CSALARY) VALUES (CLIENT_ID.nextval, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); 

     pstmt.setString(1, client.getFirstName()); 
     pstmt.setString(2, client.getLastName()); 
     pstmt.setString(3, client.getCareer()); 
     pstmt.setInt(4, client.getcSalary()); 
     pstmt.executeUpdate();  
     rs = pstmt.getGeneratedKeys(); 
     rs.next(); 
     Integer id = rs.getInt(1); 
      client.setcId(id);   
    }catch(Exception ex){ 
     ex.printStackTrace(); 
     return null; 
    }finally{ 
     try{ rs.close(); }catch (Exception e){} 
     try{ pstmt.close();}catch (Exception e){} 
     try{ con.close();}catch (Exception e){} 
    }//finally 
    return client; 
} 

}

01.235.164,106174 millions
@XmlRootElement 
    public class Client { 
private Integer cId; 
private String firstName; 
private String lastName; 
private String career; 
private int cSalary; 
public Integer getcId() { 
    return cId; 
} 
public void setcId(Integer cId) { 
    this.cId = cId; 
} 
public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public String getCareer() { 
    return career; 
} 
public void setCareer(String career) { 
    this.career = career; 
} 
public int getcSalary() { 
    return cSalary; 
} 
public void setcSalary(int cSalary) { 
    this.cSalary = cSalary; 
} 

}

e questo è il mio SQL

CREATE TABLE "AHMAD"."CLIENT" 
    ("CID" NUMBER(*,0) NOT NULL ENABLE, 
"FIRSTNAME" VARCHAR2(255 BYTE), 
"LASTNAME" VARCHAR2(255 BYTE), 
"CAREER" VARCHAR2(255 BYTE), 
"CSALARY" NUMBER, 
CONSTRAINT "CLIENT_PK" PRIMARY KEY ("CID") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT  CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "USERS" ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
     STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
     PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE   DEFAULT CELL_FLASH_CACHE DEFAULT) 
     TABLESPACE "USERS" ; 

plz aiutarmi dati è inserire nella tabella, ma non completamente e non ho questo errore fase di esecuzione

   java.sql.SQLException: Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
at oracle.jdbc.driver.Accessor.unimpl(Accessor.java:358) 
at oracle.jdbc.driver.Accessor.getInt(Accessor.java:468) 
at oracle.jdbc.driver.OracleReturnResultSet.getInt(OracleReturnResultSet.java:265) 
at com.rest.client.ClientDAO.newClient(ClientDAO.java:99) 
at com.rest.client.ClientResourcs.newClient(ClientResourcs.java:36) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at  com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.jav a:60) 
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

risposta

7

Il Il driver JDBC Oracle non restituisce l'ID generato quando si utilizza Statement.RETURN_GENERATED_KEYS in modo che la prima colonna dei tasti generati ResultSet sia non è un int, invece restituisce un ROWID (vedere JDBC tutorial on rowids) della riga inserita (in modo da poter interrogare la riga da soli). Per quanto ne so, la ragione di ciò è che Oracle non ha un tipo di identità, quindi in realtà non sa quale campo è la chiave generata.

Invece si dovrebbe essere in grado di specificare esplicitamente la colonna che si desidera restituire utilizzando prepareStatement(String sql, int[] columnIndexes) o prepareStatement(String sql, String[] columnNames).

+0

i dati inseriti nella tabella e l'ID è incremento automatico ma l'intera riga è come quella 1003 \t null \t null \t Dev \t 0 quindi perdonami iam principiante e ho l'errore – Ahmad

+0

Leggi di nuovo la mia risposta. Il problema è che pensi che la prima colonna di getGeneratedKeys contenga il valore della colonna 'CID' della riga inserita, ma non lo fa. Contiene il rowid, che è una speciale pseudocolonna definita da Oracle. –

+1

prepareStatement (String sql, int [] columnIndexes) funziona per Oracle 11g –

16

come Mark ha suggerito, ho appena affrontato lo stesso problema e trovato la soluzione:

String generatedColumns[] = { "ID" }; 
stmt = con.prepareStatement(query, generatedColumns); 

E dopo si esegue la query, effettuare le seguenti operazioni per andare a prendere l'ID inserito.

rs = stmt.getGeneratedKeys(); 
rs.next(); 
rs.getInt(1); 
+0

Grazie! Stavo ricevendo questo errore per un po ', ma non avevo mai avuto bisogno di usare alcun ID dopo un inserimento .. ma ora avevo il bisogno e il problema doveva essere risolto! Nota: perché l'oracolo è così obsoleto ??! –

1

Non so se questo problema è risuolate o no, ma ho affrontato lo stesso problema e ha ottenuto risolto sostituendo intero con int nella classe di entità (nel tuo caso è client classe)

Problemi correlati