Я работаю над приложением Java-сервера, которое использует Spring 3 и C3P0 для доступа к базе данных Microsoft SQL Server 2008 R2, используя версию 3.0 драйвера Microsoft JDBC 4.Почему мой параметр datetime для отложенной хранимой процедуры отклоняется?
У меня есть sproc, который имеет вход, определенный следующим образом:
@modifiedAfter datetime = NULL
Я использую Spring построить вызов этой sproc.
Я построения 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
или не указывая тип - ни одна из них не работает.
Я начинаю подозревать, что проблема может быть связана с весной. Я написал небольшой скрипт Groovy, чтобы попытаться изолировать проблему, и это работает просто отлично:
dt = new DateTime("2012-02-01T00:00:00") // Joda DateTime
println sql.rows("exec spMySproc @modifiedAfter=${Sql.TIMESTAMP(dt.toString())}")
... но когда я пытаюсь эквивалентный подход с MapSqlParameterSource
, я получаю вышеуказанную ошибку.
На данный момент я в тупике.
Вот вершина StackTrace:
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, но это не помогло.
Буду признателен за любую помощь!
Спасибо, Avi
Вы пробовали строку вместо Types.TIMESTAMP? Я думаю, формат Format.TIMESTAMP не может быть преобразован в sql-сервер. –
TIMESTAMP в SQL Server не имеет абсолютно никакого отношения к дате или времени. –
@ThitLwinOo, @Aaron: Я не использую формат timestamp SQL Server. Я использую формат JDBC TIMESTAMP. В соответствии с [этой страницей] (http://msdn.microsoft.com/en-us/library/ms378878.aspx) драйвер JDBC сопоставляет формат JDBC TIMESTAMP с типами SQL Server 'datetime' и' datetime2'. Кроме того, описанный выше скрипт Groovy, который использует JDBC TIMESTAMP, работает отлично. –