2011-10-17 43 views
1

我在使用java調用mssql服務器中的過程時遇到了問題。 我不斷收到org.springframework.jdbc.BadSqlGrammarException參數未被傳遞到過程

這裏是我的代碼:

public void init(@Qualifier("mssqlDataSource") DataSource dataSource) { 
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
     jdbcTemplate.setResultsMapCaseInsensitive(true); 
     this.findBgNumber = new SimpleJdbcCall(jdbcTemplate) 
      .withProcedureName(".sp_GetMaybeBGnumberKT") 
      .withCatalogName("dbVilluleit") 
      .declareParameters(new SqlParameter("@KT", java.sql.Types.VARCHAR)) 
      .returningResultSet("bgNumber", new BgRowMapper()); 
    } 

    public List<BgcNumber> getBGNumber(String kennitala) { 
     SqlParameterSource in = new MapSqlParameterSource() 
     .addValue("@KT", kennitala, java.sql.Types.VARCHAR); 
     Map<String, Object> results = findBgNumber.execute(in); 
     List<BgcNumber> list = (List<BgcNumber>) results.get("bgNumber"); 
     return list; 
    } 

堆棧跟蹤說,「@KT」沒有提供,但是這是不對的。

任何想法我在這裏做錯了嗎?

這是堆棧跟蹤

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call dbVilluleit..sp_GetMaybeBGnumberKT()}]; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Procedure or function 'sp_GetMaybeBGnumberKT' expects parameter '@KT', which was not supplied. 
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:97) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:952) 
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:985) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:368) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:342) 
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:164) 
at is.siminn.centrex.data.BgcDataGatewayImpl.getBGNumber(BgcDataGatewayImpl.java:73) 
at is.siminn.centrex.service.BgcInfoServiceImpl.getBgcInfo(BgcInfoServiceImpl.java:55) 
at is.siminn.centrex.ws.BgcImpl.getBgc(BgcImpl.java:30) 
at is.siminn.centrex.ws.BgcTestInt.testGetBGC(BgcTestInt.java:36) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233) 
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) 
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) 
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) 
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Procedure or function 'sp_GetMaybeBGnumberKT' expects parameter '@KT', which was not supplied. 
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197) 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340) 
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575) 
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400) 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179) 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:322) 
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) 
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) 
at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:987) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:936) 
... 31 more 

感謝

Gunnlaugur

回答

0

你需要調用 'declareParameters' 你 'SimpleJdbcCall時'

+0

我添加了.declareParameters(新的SqlParameter(「@ KT」,java.sql.Types.VARCHAR)),但我得到了同樣的異常 – Gunnlaugur

+0

任何想法可能會導致我的問題? – Gunnlaugur

+1

我通過添加對withoutProcedureColumnMetaDataAccess的調用來解決問題 – Gunnlaugur

0

我有一個類似的錯誤消息,但實際問題是沒有指定.withSchemaName。