2009-05-12 13 views
0

Dieser hat mich ratlos.Java ResultSet getString Seltsamkeit?

Ich habe ein java.sql.ResultSet bekam und ich bin String-Werte aus ihm ziehen, wie so:

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

Wenn ich debuggen und rs.getString ("AddressLine1") prüfen, um den Debugger Ich habe eine Zeichenfolge mit 30 Zeichen: "ATTN: ACCOUNTS PAYABLE" (Leerzeichen wurden entfernt). Wenn ich jedoch mein Adressobjekt unmittelbar nach dieser Zeile überprüfe, meldet es, dass AdresseLine1 eine 30-stellige Zeichenfolge aus Leerzeichen oder einem anderen Leerzeichen ist.

Wenn ich rs.getString ("AddressLine2") debugge und inspiziere, sagt der Debugger, dass ich eine 23-stellige Zeichenfolge habe: "10 Something Street" (nachgestellte Leerzeichen entfernt). Wenn ich mein Adressobjekt unmittelbar nach dieser Zeile überprüfe, wird gemeldet, dass AdresseLine2 null ist.

Was mich wirklich verrückt macht ist, dass dies nicht mit jedem Wert passiert, nur ein paar.

Meine Adressklasse speichert einfache alte Zeichenfolgen mit völlig dummen Getter und Setter. Wirklich, ich verspreche es! Dies wird geschnitten & Pasten mit anderen stummen Eigenschaften entfernt:

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; 
} 
} 

Was zum Teufel ist hier los? Ist es ein seltsames Scoping-Problem? Ist es eine Art Zeichencodierung?

P.S. - Ich benutze Spring's SimpleJdbcTemplate, und die "Pseudo-Datenbank", mit der ich spreche, ist ProvideX, auf das ich über ODBC (sun.jdbc.odbc.JdbcOdbcDriver) zugreife.

Antwort

4

Hinweis, was die javadocs sagen über ResultSet: „Für maximale Portabilität, Satz Spalten führen in jeder Zeile sollte in von links nach rechts gelesen werden, und jede Spalte nur einmal gelesen werden.“ Wenn Sie also die Spalte mithilfe des Debuggers lesen, liest der Code sie ein zweites Mal, wenn setAddressLine1 aufgerufen wird.

Wie verhält es sich, wenn Sie nur addressLine1 betrachten und nicht mit dem ResultSet herumspielen?

+0

Ich habe gerade bemerkt, dass Sie durch ODBC gehen; Wahrscheinlich möchten Sie in diesem Fall im Vergleich zu einem normalen jdbc-Treiber nach maximaler Portabilität streben. – lumpynose

+0

Das Gleiche. Wenn ich nicht debugge und nur die Ausgabe betrachte, ist mein addressLine1-Wert eine 30 Zeichen lange Whitespace-Zeichenkette, und addressLine2 ist null. Wenn ich eine temporäre Zeichenfolge wie folgt erstellen: String tmp = rs.getString ("AddressLine1"); und debuggen, der Wert von tmp ist korrekt. Ich bin hier wirklich ratlos. – Boden

+0

Uh, warum kannst du nicht tun? String tmp = rs.getString ("AddressLine1"); address.setAddressLine1 (tmp); '? Geht es nur darum, dem auf den Grund zu gehen? –