Vig*_*ggy 2 sql-server-2005 sqljdbc mybatis sql-server-2012
我们正在从 SQL Server 2005 迁移到 2012。其中一项功能因此错误而失败
com.microsoft.sqlserver.jdbc.SQLServerException:不允许从数据类型 varbinary 到 datetime2 的隐式转换。使用 CONVERT 函数运行此查询。
我们用来SQLJDBC driver 3.0与 SQL Server 2012 进行通信。当我们尝试将 NULL 值插入列DATETIME(可为空)时,我发现会发生此问题。但在 2005 年也同样有效。对于此问题的任何帮助,我们将不胜感激。
这是一个INSERT使用 MyBatis ORM 从 Java 到 SQL Server 2012 失败的简单语句:
Insert into temp_test (date1, name, date2) values ('2010-10-10 00:00:00.0','test',null)
Run Code Online (Sandbox Code Playgroud)
当我们尝试从我们的应用程序(使用 SQL JDBC 驱动程序)时,此插入失败...但是相同的代码库在 SQL 2005 中可以正常工作,没有任何问题。
当我尝试在 DATETIME2 列可能为空的地方进行插入时,我刚刚在 MyBatis 和 SQL Server 2012 中遇到了这个错误。我的问题的解决方案是在我的映射器文件中指定 JDBC 类型,如 MyBatis 文档中所指定。
来自: http: //www.mybatis.org/mybatis-3/sqlmap-xml.html#Parameters
如果 null 作为值传递,则 JDBC 对于所有可为 null 的列都需要 JDBC 类型。您可以通过阅读有关PreparedStatement.setNull() 方法的JavaDocs 来自行研究这一点。
在映射器文件中的插入语句中,date2 列的值将添加“jdbctype = TIMESTAMP”,如下所示:
<insert id="testInsert" parameterType="com.example.object">
INSERT INTO tempt_test
(date1, name, date2)
VALUES
(#{date1}, #{name}, #{date2, jdbcType = TIMESTAMP})
</insert>
Run Code Online (Sandbox Code Playgroud)