是什么导致 Java 程序以不同方式对待两个 ResultSet.getString() 方法?
What is causing Java program to treat the two ResultSet.getString() methods differently?
如果 "FirstName" 和索引 1 引用查询中的同一列,并且 rs
是 ResultSet
,为什么
if(rs.getString("FirstName")!=null) fullName = rs.getString("FirstName");
和
if(rs.getString(1)!=null) fullName = rs.getString(1);
行为不同?
根据 Java 文档,使用 columnIndex
或 columnLabel
两者都是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 驱动程序返回了错误的数据。
如果 "FirstName" 和索引 1 引用查询中的同一列,并且 rs
是 ResultSet
,为什么
if(rs.getString("FirstName")!=null) fullName = rs.getString("FirstName");
和
if(rs.getString(1)!=null) fullName = rs.getString(1);
行为不同?
根据 Java 文档,使用 columnIndex
或 columnLabel
两者都是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
.
所以要回答这个问题,ResultSet.getString()
方法可能一直都在正确运行,但是 SQL 驱动程序返回了错误的数据。