2

我们正在从 SQL Server 2005 迁移到 2012。其中一项功能因此错误而失败

com.microsoft.sqlserver.jdbc.SQLServerException:不允许从数据类型 varbinary 到 datetime2 的隐式转换。使用 CONVERT 函数运行此查询。

我们SQLJDBC driver 3.0用来与 SQL Server 2012 进行通信。当我们尝试将 NULL 值插入DATETIME列(可为空)时,我发现这个问题正在发生。但同样适用于 2005 年。对此问题的任何帮助表示赞赏。

这是一个使用 MyBatis ORM 从 Java 到 SQL Server 2012 失败的简单INSERT语句:

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

当我们从我们的应用程序(使用 SQL JDBC 驱动程序)尝试时,此插入失败......但是相同的代码库在 SQL 2005 中没有任何问题。

4

2 回答 2

4

在尝试插入 DATETIME2 列可能为空的情况时,我刚刚在 MyBatis 和 SQL Server 2012 中遇到了这个错误。我的问题的解决方案是在 MyBatis 文档中指定的映射器文件中指定 JDBC 类型。

来自:http ://www.mybatis.org/mybatis-3/sqlmap-xml.html#Parameters

如果 null 作为值传递,则 JDBC 要求所有可空列的 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>
于 2018-06-07T13:28:33.417 回答
1

我可以推荐以下关于从迁移到 SQL Server 2012 的阅读,由Thomas LaRock (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 驱动程序(开源 100% 纯 Java(类型 4)用于 Microsoft SQL Server 的 JDBC 3.0 驱动程序,支持 2012)
  • 安装最新的 SQL Server 2012 Service Pack(最新的是 Service Pack 3;概述)。
  • 查看MyBatis与 SQL Server 2012 的任何不兼容性。
于 2016-01-19T07:26:59.517 回答