【问题标题】:Cannot insert null in datetimeoffset column in SQL Server using Teiid无法使用 Teiid 在 SQL Server 的 datetimeoffset 列中插入空值
【发布时间】:2020-08-14 13:07:46
【问题描述】:

我正在使用 Teiid 在 datetimeoffset 列中插入空值,但 PreparedStatement.setNull(index, Types.TIMESTAMP) 没有插入空值。我得到的错误是这样的:

原因:java.sql.SQLException:远程 com.microsoft.sqlserver.jdbc.SQLServerException:不允许从数据类型 varbinary 到 datetimeoffset 的隐式转换。使用 CONVERT 函数运行此查询。

在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632)
在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:600)
在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:522)
在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7225)
在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3053)
在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247)
在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222)
在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:471)
在 org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:537) 在 org.teiid.translator.jdbc.JDBCUpdateExecution.executeTranslatedCommand(JDBCUpdateExecution.java:315) ...省略了27个常用框架

以下是我的 SQL Server 2012 版本的数据源详细信息:

<driver name="sqlserver" module="com.microsoft.sqlserver">
    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
    <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
</driver>

驱动版本为:mssql-jdbc-8.2.0.jre8

我尝试在没有 Teiid 的情况下插入 null(通过使用 Microsoft jdbc 驱动程序建立 sql 连接)并且它正在工作。该表仅包含一列,其数据类型为 datetimeoffset

请就除此之外我可以尝试的方法提出任何想法。提前致谢!

【问题讨论】:

  • NULL 与此无关;错误非常具体:“不允许从数据类型 varbinary 到 datetimeoffset 的隐式转换。请使用 CONVERT 函数运行此查询。” 您正在尝试将 varbinary 插入到 @987654328 @;这就是问题所在。
  • 其实我只是在执行 PreparedStatment.setNull(),我没有在其中插入除 NULL 之外的任何值。我的 PreparedStatment 的 paramterMap 在调用 setNull(); 后显示 {1=null};
  • teiid 的架构详细信息,将 datetimeoffset 读取为 object(34),这可能会导致问题吗?

标签: sql-server teiid


【解决方案1】:

这被捕获为一个 Teiid 问题:https://issues.redhat.com/browse/TEIID-5949

建议了对象类型映射的解决方法,但可能应该通过更新导入逻辑来解决。

【讨论】:

  • 我通过将 datetimeoffset 作为时间戳更改了架构,然后部署了 vdb,它正在工作。感谢您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2018-01-31
  • 2023-03-17
  • 2014-10-28
相关资源
最近更新 更多