gpt4 book ai didi

java - 在 Java 1.7.0 下运行的 SQL-Server (MSSQL-JDBC 3.0) 中的日期列检索为过去 2 天

转载 作者:太空狗 更新时间:2023-10-29 22:45:48 24 4
gpt4 key购买 nike

在使用 Microsoft JDBC-Driver version 3.0 从 SQLServer2008 中检索类型为 DATE 的列时出现奇怪的效果在官方 Oracle JDK 1.7.0 下运行时。主机操作系统是 Windows Server 2003。

根据列中实际存储的值,所有日期列都被检索为过去两天 天。

我编写了一个最小的代码示例来测试它(测试表和数据):

CREATE TABLE Java7DateTest (
dateColumn DATE
);
INSERT INTO Java7DateTest VALUES('2011-10-10');

代码:

public class Java7SQLDateTest {

public static void main(final String[] argv) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager.getConnection(
"jdbc:sqlserver://192.168.0.1:1433;databaseName=dbNameHere",
"user", "password");
PreparedStatement statement = connection.prepareStatement("SELECT * FROM Java7DateTest");
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
final java.sql.Date date = resultSet.getDate("dateColumn");
final String str = resultSet.getString("dateColumn");
System.out.println(date + " (raw: " + str + ")");
}
resultSet.close();
statement.close();
connection.close();
} catch (final Throwable t) {
throw new RuntimeException(t.getMessage(), t);
}
}

}

在上述配置上运行此代码打印:“2011-10-08(原始:2011-10-08)”。在 JRE 1.6.0_27 下它打印:“2011-10-10(原始:2011-10-10)”

我找不到任何似乎与我的谷歌问题有关的东西,所以我假设它要么是我忽略的愚蠢的东西,要么还没有人在使用 Java7。

有人可以确认这个问题吗?如果我仍然想使用 Java7,我有什么选择?

编辑:即使使用 -Xint 运行时也会出现此问题,因此它不是由 Hotspot 错误引起的。

Edit2:旧驱动程序 (Microsoft 1.28) 可以与 JDK1.7.0 一起正常工作(我想我们可能在两年前才使用该驱动程序)。jTDS 也可以很好地处理这个例子。我正在考虑切换到 jTDS,但我不太情愿这样做,因为我完全不知道这对我们的生产环境可能会产生什么影响。理想情况下,它应该可以正常工作,但当我将开发箱切换到 Java7 时,我也相信这一点。生产环境中有一个非常胖的数据库,它太大而无法创建副本,用于测试(或者更确切地说,我们的服务器只剩下很少的磁盘)。因此,为该应用程序设置测试环境并不简单,我必须为此拼接一个缩小的数据库。

Edit3:jTDS 附有自己的一组捕获。我发现了一个破坏我们应用程序之一的行为差异。 ResultSet.getObject() 根据驱动程序(Short 与 Integer)为 SmallInt 列返回不同的对象类型。另外jTDS没有实现JDBC4 Connection接口(interface),不支持Connect.isValid()。

Edit4:我上周注意到,在我更新到 JDK1.6.0_29 后,MSSQL-JDBC 3.0 拒绝连接到任何数据库。然后是 jTDS...我们昨天切换了生产服务器(我修复了应用程序依赖驱动程序特性的两个地方),到目前为止我们没有遇到任何问题。

最佳答案

感谢您的反馈。 Microsoft JDBC Driver for SQL Server 尚不支持 JRE 1.7。

我们知道我们的 JDBC 驱动程序和 JRE 1.7 之间的 getDate 问题,我们正在考虑发布一个修补程序,以使客户能够继续使用 JRE 1.7 对我们的驱动程序进行非生产测试。

一旦可用,我们将在我们的博客上发布指向修补程序的链接。 http://blogs.msdn.com/b/jdbcteam/

修补程序现在可用。 http://blogs.msdn.com/b/jdbcteam/archive/2012/01/20/hotfix-available-for-date-issue-when-using-jre-1-7.aspx

我们的博客还包含有关 JRE 1.6u29 和 1.6u30 的已知问题的信息。

沙米莎雷迪程序经理 - Microsoft JDBC Driver for SQL Server

关于java - 在 Java 1.7.0 下运行的 SQL-Server (MSSQL-JDBC 3.0) 中的日期列检索为过去 2 天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7724258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com