Java ResultSet getString 怪异?

标签 java jdbc resultset

这个把我难住了。

我有一个 java.sql.ResultSet,我正在从中提取字符串值,如下所示:

address.setAddressLine1(rs.getString("AddressLine1"));
address.setAddressLine2(rs.getString("AddressLine2"));

当我调试和检查 rs.getString("AddressLine1") 时,调试器说我有一个 30 个字符的字符串:“ATTN: ACCOUNTS PAYABLE”(删除了尾随空格)。但是,当我在该行之后立即检查我的地址对象时,它报告说addressLine1是一个由空格或其他空白组成的30个字符的字符串。

当我调试和检查 rs.getString("AddressLine2") 时,调试器说我有一个 23 个字符的字符串:“10 Something Street”(删除了尾随空格)。当我在该行之后立即检查我的地址对象时,它报告 addressLine2 为 null

真正让我抓狂的是,这种情况并没有发生在所有值上,只有少数值发生。

我的地址类正在存储带有完全愚蠢的 getter 和 setter 的普通旧字符串。真的,我保证!这是剪切和粘贴并删除了其他愚蠢属性的:

public class Address implements java.io.Serializable {

 private static final long serialVersionUID = 1L;
 private String addressLine1; 
 private String addressLine2; 

 public String getAddressLine1() {
  return addressLine1;
 }

 public void setAddressLine1(String addressLine1) {
  this.addressLine1 = addressLine1;
 }

 public String getAddressLine2() {
  return addressLine2;
 }

 public void setAddressLine2(String addressLine2) {
  this.addressLine2 = addressLine2;
 }
}

这到底是怎么回事?这是某种奇怪的范围问题吗?它是某种字符编码吗?

附注- 我正在使用 spring 的 SimpleJdbcTemplate,而我正在谈论的“伪数据库”是 ProvideX,我通过 ODBC (sun.jdbc.odbc.JdbcOdbcDriver) 访问它。

最佳答案

请注意 javadoc 关于 ResultSet 的说法:“为了获得最大的可移植性,每行中的结果集列应按从左到右的顺序读取,并且每列应仅读取一次。”因此,当您使用调试器读取该列时,这是一次读取,然后您的代码在调用 setAddressLine1 时会再次读取它。

当您只查看 addressLine1 而不修改 ResultSet 时,它的行为如何?

关于Java ResultSet getString 怪异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854071/

相关文章:

postgresql - Py4JJavaError java.lang.NullPointerException org.apache.spark.sql.DataFrameWriter.jdbc

java - 执行 2 个或更多 Runnable 会导致性能问题

java - 甲骨文java连接

java - 包 oracle.jdbc.driver 不存在

java - 第二个结果集给出错误

oracle - 通过数据库链接获取 ResultSet/RefCursor

java - 使用jsp :include to pass a array from one jsp page to another

java - Mule ESB - 在流程中使用现有的 servlet

java - Tomcat 7.50+JDK 64bit 1.7.0.51 启动问题

java - 连接行为 - DriverManager.getConnection() 和 DataSource.getConnection()