Java ResultSet getString странность? - PullRequest
0 голосов
/ 12 мая 2009

Это меня поставило в тупик.

У меня есть набор 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 .

Что действительно сводит меня с ума, так это то, что это происходит не с каждым значением, а с несколькими.

Мой адресный класс хранит простые старые строки с совершенно тупыми геттерами и сеттерами. Действительно, я обещаю! Это вырезать и вставить с другими немыми свойствами удалены:

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. - Я использую SimpleJdbcTemplate Spring, и «псевдо-база данных», с которой я говорю, - это ProvideX, к которому я обращаюсь через ODBC (sun.jdbc.odbc.JdbcOdbcDriver).

1 Ответ

4 голосов
/ 12 мая 2009

Обратите внимание, что javadocs говорит о ResultSet: «Для максимальной переносимости столбцы набора результатов в каждой строке должны читаться в порядке слева направо, , и каждый столбец должен читаться только один раз ». Поэтому, когда вы читаете столбец с помощью отладчика, это одно чтение, а ваш код читает его второй раз, когда вызывается setAddressLine1.

Как ведет себя, когда вы смотрите только на addressLine1 и не работаете с ResultSet?

...