Java ResultSet getString怪异吗?

时间:2009-05-12 18:10:25

标签: 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;
 }
}

这里到底发生了什么?这是一种奇怪的范围问题吗?它是某种字符编码的东西吗?

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

1 个答案:

答案 0 :(得分:4)

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

当您只查看addressLine1并且不使用ResultSet时,它的行为如何?