2013-09-28 34 views
5

mi stosując poniżej kod podczas wkładania wiersza do danych (danych 10g Xe słoika: ojdbc14.jar)Pierwsze „Nieprawidłowy kolumny typu” excecption podczas korzystania NamedParameterJDBCTemplate do wkładania

String sql = "INSERT INTO SPONSOR_TB(ID,NAME,INDUSTRY_TYPE,IS_REPORTING_SPONSOR,IS_NOT_SOLICITE) VALUES(SEQ_SPONSOR_ID.NEXTVAL,:NAME1,:INDUSTRY_TYPE,:IS_REPORTING_SPONSOR,:IS_NOT_SOLICITE)"; 

MapSqlParameterSource paramSource = new MapSqlParameterSource(); 
paramSource.addValue("NAME1",sponsor.getName()); 
paramSource.addValue("INDUSTRY_TYPE", sponsor.getIndustryType()); 
paramSource.addValue("IS_NOT_SOLICITE", sponsor.getNotSoliciteFlag()?'Y':'N'); 
paramSource.addValue("IS_REPORTING_SPONSOR", sponsor.getReportingFlag()?'Y':'N'); 
KeyHolder generatedKeyHolder = new GeneratedKeyHolder(); 
namedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder,new String[]{"ID"}); 
int id = generatedKeyHolder.getKey().intValue(); 

Struktura tabeli jest :

create table SPONSOR_TB 
(
id     INTEGER not null, 
name     VARCHAR2(20), 
industry_type  INTEGER not null, 
is_reporting_sponsor CHAR(1) not null, 
is_not_solicite  CHAR(1) not null 
) 

i SEQ_SPONSOR_ID jest sekwencja

i sponsora klasa:

public class Sponsor{ 
     private int id; 
     private String name; 
     private boolean reportingFlag; 
     private boolean notSoliciteFlag; 
     private int industryType; 
     //getter setter 
} 

I db konfiguracja w wiosenno-servlet.xml jest:

<beans:bean 
    id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource" > 

    <beans:property 
     name="driverClassName" 
     value="oracle.jdbc.driver.OracleDriver" /> 

    <beans:property 
     name="username" 
     value="SPONSOR_DB" /> 

    <beans:property 
     name="password" 
     value="ajeet" /> 

    <beans:property 
     name="url" 
     value="jdbc:oracle:thin:@localhost:1521:XE" /> 
</beans:bean> 

otrzymuję następujący wyjątek:

SEVERE: Servlet.service() for servlet [spring] in context with path [/GroupSolution] threw exception [Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [INSERT INTO SPONSOR_TB (ID,NAME,INDUSTRY_TYPE,IS_REPORTING_SPONSOR,IS_NOT_SOLICITE) VALUES(SEQ_SPONSOR_ID.NEXTVAL,?,?,?,?)]; SQL state [null]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type] with root cause 
java.sql.SQLException: Invalid column type 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:9168) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8749) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9471) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:9454) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:127) 
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:298) 
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:251) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:581) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:843) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:288) 
    at com.groupsolution.dao.SponsorDaoImpl.createSponsor(SponsorDaoImpl.java:55) 
    at com.groupsolution.service.SponsorServiceImpl.createSponsor(SponsorServiceImpl.java:31) 
    at com.groupsolution.controller.SponsorController.addSponsor(SponsorController.java:38) 
    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 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    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:225) 
    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:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    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:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+0

Przez combinig odpowiedzi od Dawida i Halfbit, dostał soultion: zmieniło moje pole z bazy danych CHAR (1) do CHAR (2) a następnie próbował paramSource.addValue ("NAME1", sponsor.getName() , Types.VARCHAR); paramSource.addValue ("INDUSTRY_TYPE", sponsor.getIndustryType(), Types.INTEGER); paramSource.addValue ("IS_NOT_SOLICITE", sponsor.getNotSoliciteFlag()? "Y": "N", Types.VARCHAR); paramSource.addValue ("IS_REPORTING_SPONSOR", sponsor.getReportingFlag()? "Y": "N", Types.VARCHAR); Dzięki Dawidowi i Halfbit –

Odpowiedz

5

może chcesz spróbować użyć zamiast ciągów znaków dla CHAR (1) Pola Y/N.

+0

dzięki dużo @halfbit .. zmieniło moje pole z bazy danych CHAR (1) Char (2) a następnie próbował paramSource.addValue ("NAME1", sponsor.getName() , Types.VARCHAR); paramSource.addValue ("INDUSTRY_TYPE", sponsor.getIndustryType(), Types.INTEGER); paramSource.addValue ("IS_NOT_SOLICITE", sponsor.getNotSoliciteFlag()? "Y": "N", Types.VARCHAR); paramSource.addValue ("IS_REPORTING_SPONSOR", sponsor.getReportingFlag()? "Y": "N", Types.VARCHAR); To zadziałało dla mnie ... :-) –

2

Spróbuj zmienić swój kod do:

paramSource.addValue("NAME1",sponsor.getName(), Types.VARCHAR); 
paramSource.addValue("INDUSTRY_TYPE", sponsor.getIndustryType(), Types.INTEGER); 
paramSource.addValue("IS_NOT_SOLICITE", sponsor.getNotSoliciteFlag()?'Y':'N', Types.CHAR); 
paramSource.addValue("IS_REPORTING_SPONSOR", sponsor.getReportingFlag()?'Y':'N', Types.CHAR); 
+0

@ David- Próbowałem użyć Types.xxxx, który zasugerowałeś. Ale teraz dostaję błąd: SQL state [null]; kod błędu [17132]; Wybrano niepoprawną konwersję; Nawet jeśli zmieniłem kod na: paramSource.addValue ("NAME1", "somename", Types.VARCHAR); paramSource.addValue ("INDUSTRY_TYPE", 2, Types.INTEGER); paramSource.addValue ("IS_NOT_SOLICITE", "N", Types.CHAR); paramSource.addValue ("IS_REPORTING_SPONSOR", "N", Types.CHAR); –

0

dla mnie ta kwestia się, gdy próbuję ustawić wartość null w kolumnie timestamp. Zmieniłem znacznik czasu wartości (0). Wydaje mi się, że jest to problem ze sterownikiem. I był przy użyciu Oracle 10g/ojdbc14.jar/oracle.jdbc.OracleDriver

java.sql.SQLException: Invalid column type 
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) 
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) 
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269) 
    at oracle.jdbc.driver.OracleStatement.get_internal_type(OracleStatement.java:6433) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:1354) 
1

Otrzymujesz ten wyjątek ponieważ używasz JdbcTemplate zamiast NamedParameterJdbcTemplate. MapSqlParameterSource współpracuje z NamedParameterJdbcTemplate.

+0

To było dokładnie to! Dziękujemy za opublikowanie! – Erikson

Powiązane problemy