是什么导致 Java 程序以不同方式对待两个 ResultSet.getString() 方法?

What is causing Java program to treat the two ResultSet.getString() methods differently?

如果 "FirstName" 和索引 1 引用查询中的同一列,并且 rsResultSet,为什么

if(rs.getString("FirstName")!=null) fullName = rs.getString("FirstName");

if(rs.getString(1)!=null) fullName = rs.getString(1);

行为不同?

根据 Java 文档,使用 columnIndexcolumnLabel 两者都是return指定列的值。

当我使用 columnIndex 而不是 columnLabel 时,我 运行 遇到了一个奇怪的问题,出于某种原因,在 jsp 被 运行 对于几个 hours/days 然后 if(rs.getString(1)!=null) 即使字符串是 null 也计算为真。当我改用 columnLabel 时,问题就不会发生。谁能告诉我为什么会这样?

额外的背景信息

程序运行在Tomcat。我们在同一天更新了 Tomcat、JVM 和我们的数据库驱动程序,这开始发生了。如果我们在 Tomcat 中重新加载应用程序,它会开始正常工作,至少会持续几个小时。我们切换回旧的数据库驱动程序,问题仍然存在,因此我们排除了数据库驱动程序。

rs.getString(1) returns 执行的 SQL 查询中第一列的数据(由 preparedStatement 执行),它不必是 FirstName ,您需要交叉检查 preparedStatement 中的 SQL 查询是否如下所示:

SELECT FirstName from X;//you might add where conditions

来自您的评论:

it just starts returning the String "null" instead of the actual null value. So the fullName becomes the String "null".

换句话说,这个问题与你问题中所说的不同。 null"null" 不是一回事,所以如果实际值是 "null" 就没有理由 rs.getString(1) == null 到 return true .

我会说您的数据库中某处可能有 "null"。查看。或者您在代码中的某处使用 String.valueOf(null) ,可能是间接的,例如通过调用它的 println(null),所以输出是 "null".

我们已经解决了。我们决定尝试不同的 SQL 驱动程序(我们之前使用的是 Microsoft 驱动程序,我们切换到 JTDS)并且所有问题都消失了。

所以我猜 Microsoft 驱动程序在它应该返回 null.

时返回了字符串 "null"

所以要回答这个问题,ResultSet.getString() 方法可能一直都在正确运行,但是 SQL 驱动程序返回了错误的数据。