SQL Server 2005 - 2012 com.microsoft.sqlserver.jdbc.SQLServerException: неявное преобразование из типа данных varbinary в datetime2 не допускается

Мы переходим с SQL Server 2005 на 2012 год. Одна из функций не работает с этой ошибкой

com.microsoft.sqlserver.jdbc.SQLServerException: неявное преобразование из типа данных varbinary в datetime2 не допускается. Используйте функцию CONVERT, чтобы выполнить этот запрос.

Мы используем SQLJDBC driver 3.0 для связи с SQL Server 2012. Я вижу, что эта проблема возникает, когда мы пытаемся вставить значение NULL в DATETIME столбец (обнуляемый). То же самое, однако, работает в 2005 году. Любая помощь в этом вопросе приветствуется.

Это просто INSERT оператор, который терпит неудачу от Java до SQL Server 2012, используя MyBatis ORM:

Insert into temp_test (date1, name, date2) values ('2010-10-10 00:00:00.0','test',null) 

Эта вставка завершается неудачно, когда мы пытаемся из нашего приложения (используя драйвер JDBC SQL)... Однако та же база кода работает без каких-либо проблем в SQL 2005.

2 ответа

Я только что натолкнулся на эту ошибку с MyBatis и SQL Server 2012 при попытке сделать вставку, где столбец DATETIME2 может быть нулевым. Решением моей проблемы было указание типа JDBC в моем файле сопоставления, как указано в документации MyBatis.

От: http://www.mybatis.org/mybatis-3/sqlmap-xml.html

Тип JDBC требуется JDBC для всех обнуляемых столбцов, если в качестве значения передается значение NULL. Вы можете исследовать это самостоятельно, прочитав JavaDocs для метода PreparedStatement.setNull().

В операторе вставки в файле сопоставления к значению столбца date2 будет добавлено "jdbctype = TIMESTAMP", например:

<insert id="testInsert" parameterType="com.example.object">
    INSERT INTO tempt_test
      (date1, name, date2)
    VALUES
      (#{date1}, #{name}, #{date2, jdbcType = TIMESTAMP})
</insert>

Я могу порекомендовать следующую статью о миграции с SQL Server 2012, написанную Томасом Лароком (SolarWinds).

Соответствующие цитаты из статьи:

Кроме того, трудно сказать более конкретные вещи по вашей проблеме, не видя определения таблицы. Однако я бы предложил следующие вещи:

  • Строки DATE/TIME должны быть максимально отформатированы в формате ISO 8601: например, '2010-10-10T00:00:00.0'
  • Если у вас все еще возникают проблемы, попробуйте вставить CAST('2010-10-10T00:00:00.0' AS DATETIME) или же CONVERT(DATETIME,datetimecolumn,<format>)
  • Сбросьте уровень совместимости вашей базы данных до соответствующей версии для SQL Server 2012: ALTER DATABASE <database_name> SET COMPATIBILITY_LEVEL=110;
  • Обновите драйвер SQLJDBC до последней версии (текущая версия 6.0).
  • Используйте другой драйвер, например, драйвер JTDS JDBC ( драйвер JDBC 3.0 с открытым исходным кодом, 100% чистый Java (тип 4) для Microsoft SQL Server, 2012, поддерживается)
  • Установите последний пакет обновления для SQL Server 2012 (последний - пакет обновления 3; обзор).
  • Обзор MyBatis за любые несовместимости с SQL Server 2012.
Другие вопросы по тегам