Was passiert in einem JDBC-ResultSet, wenn getLong () oder getShort () für eine int-Ergebnisspalte aufgerufen wird?

8

Sagen Sie, dass ich ein JDBC ResultSet habe, und rufe die Methode getLong () oder getshort () auf.

Für welche der folgenden SQL-Typen {SMALLINT, INT, BIGINT} sollte ich lang werden, und für welche Typen sollte ich einen Fehler bekommen?

Mit anderen Worten, wenn ich einen INT habe und einen SMALLINT (A short) möchte, würde ich ihn bekommen, oder würde ich einen Fehler bekommen? Ähnlich, wenn ich einen INT habe und einen BIGINT (einen langen) möchte, würde ich es bekommen, oder würde ich einen Fehler bekommen?

Die Javadocs (unten aufgeführt) sagen nichts.

  

public long getLong (int Spaltenindex)                löst SQLException

aus %Vor%      

dieses ResultSet-Objekts als long in   die Java-Programmiersprache.

%Vor%
    
Uri 13.05.2010, 18:52
quelle

4 Antworten

9

Aus den Abrufen von Werten aus Resultsets Abschnitt der Java-Tutorials:

  

JDBC ermöglicht eine Menge Spielraum bei den getXXX-Methoden, mit denen Sie die verschiedenen SQL-Typen abrufen können. Zum Beispiel kann die Methode getInt zum Abrufen beliebiger numerischer Zeichen oder Zeichentypen verwendet werden. Die Daten, die es abruft, werden in ein int umgewandelt; Das heißt, wenn der SQL-Typ VARCHAR ist, versucht JDBC, eine Ganzzahl aus dem VARCHAR zu analysieren. Die Methode getInt wird jedoch nur zum Abrufen von SQL INTEGER-Typen empfohlen und kann nicht für die SQL-Typen BINARY, VARBINARY, LONGVARBINARY, DATE, TIME oder TIMESTAMP verwendet werden.

Ich interpretiere das so, dass die Daten erzwungen werden. Es sollte gut funktionieren, wenn es ein Upcast ist, aber ich würde einen möglichen Verlust an Präzision erwarten (natürlich), wenn Sie zum Beispiel einen LONG-Wert mit getInt() lesen. Ich würde erwarten, dass eine Ausnahme ausgelöst wird, wenn Sie versuchen, Text mit getInt() zu lesen.

    
Bill the Lizard 13.05.2010, 19:06
quelle
2

Es wird es zu lange werfen und es sollte in Ordnung sein.

Sie erhalten eine Fehlermeldung, wenn Sie versuchen, eine lange Zeichenfolge aus einer Zeichenfolge mit "Bob" oder einem anderen Feld zu erhalten, das nicht einfach in eine lange konvertiert werden kann.

    
Will Hartung 13.05.2010 18:56
quelle
1

Die Spezifikation sagt nichts über dieses Verhalten aus. Dies hängt vollständig von der Implementierung der Treiber ab.

Mit dem MySQL Connector können Sie fast alles erhalten, was wie eine Zahl aussieht, solange es ein gültiges numerisches Format hat und im Bereich von long liegt. Null / False werden ebenfalls als 0 zurückgegeben.

    
ZZ Coder 13.05.2010 18:59
quelle
1

Dies ist abhängig von der Implementierung. Die Spezifikation besagt, dass die ResultSet-Implementierung eine solche Konvertierung unterstützen kann, und Sie können dies überprüfen, indem Sie DataBaseMetaData.supportsConvert(int fromType, int toType) aufrufen (Abschnitt 15.2.3.1 der 4.0-Implementierer-Spezifikation).

Am besten ist, sich nicht auf das Verhalten zu verlassen, sondern die ResultSetMetaData auf den korrekten Typ zu überprüfen.

    
Yishai 13.05.2010 19:09
quelle

Tags und Links