我正在使用Spring 3和C3P0訪問Microsoft SQL Server 2008 R2數據庫,使用Microsoft的JDBC 4驅動程序版本3.0的Java服務器應用程序。爲什麼我的datetime參數存儲過程被拒絕?
我有一個具有像這樣定義的輸入一個存儲過程:
@modifiedAfter datetime = NULL
我使用Spring來構建這個存儲過程的調用。
我構建MapSqlParameterSource包含我的參數:
MapSqlParameterSource in = new MapSqlParameterSource()
in.addValue("modifiedAfter", "2011-01-01T00:00:00", Types.TIMESTAMP)
但是,當我執行調用:
this.sprocCall.execute(in);
我得到這個:
com.microsoft。 sqlserver.jdbc.SQLServerException:從字符串中轉換日期和/或時間時轉換失敗
...我不知道爲什麼。
我已經嘗試了一些添加參數的變體,比如將它作爲Date
傳入,或將其指定爲VARCHAR
,或者不指定類型 - 它們都不起作用。
我開始懷疑這個問題可能與Spring有關。我寫了一個小Groovy腳本來嘗試隔離問題,而這工作得很好:
dt = new DateTime("2012-02-01T00:00:00") // Joda DateTime
println sql.rows("exec spMySproc @modifiedAfter=${Sql.TIMESTAMP(dt.toString())}")
...但是當我嘗試MapSqlParameterSource
等效方法,我得到上述錯誤。
在這一點上,我很難過。
這裏的堆棧跟蹤的頂部:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call spGetPoliciesCatalogPaged(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}]; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string.
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)
...接着是一些我的班,那麼這樣的:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4762)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1682)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:955)
at com.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:2859)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:91)
at org.springframework.jdbc.core.JdbcTemplate.processResultSet(JdbcTemplate.java:1124)
at org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults(JdbcTemplate.java:1023)
at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:995)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:936)
... 68 more
我試圖更新到最新版本的spring-jdbc
,3.1。 1,但它沒有幫助。
我會很感激任何幫助!
感謝, 阿維
你試過字符串而不是Types.TIMESTAMP嗎?我認爲Types.TIMESTAMP格式不能在sql server中轉換。 – 2012-03-01 21:59:05
SQL Server中的TIMESTAMP與日期或時間完全無關。 – 2012-03-01 22:21:08
@ThitLwinOo,@Aaron:我沒有使用SQL Server'timestamp'格式。我正在使用JDBC TIMESTAMP格式。根據[本頁](http://msdn.microsoft.com/zh-cn/library/ms378878.aspx),JDBC驅動程序將JDBC TIMESTAMP格式映射到SQL Server類型「datetime」和「datetime2」。另外,使用JDBC TIMESTAMP的上述Groovy腳本工作得很好。 – 2012-03-01 22:41:45