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).
Соответствующие цитаты из статьи:
- Использование помощника по обновлению SQL 2012
- Просмотрите последние изменения
- Обзор поведенческих изменений
- проведение
DBCC CHECKDB WITH DATA_PURITY
(проверит ваши данные на предмет значений, которые больше не действительны)
Кроме того, трудно сказать более конкретные вещи по вашей проблеме, не видя определения таблицы. Однако я бы предложил следующие вещи:
- Строки 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.