Verwenden von Standarddatentypen

JDBC-Treiber herunterladen

Der Microsoft JDBC-Treiber für SQL Server verwendet grundlegende JDBC-Datentypen, um SQL Server-Datentypen in ein Format zu konvertieren, das von der Java-Programmiersprache interpretiert werden kann und umgekehrt. Der JDBC-Treiber bietet Unterstützung für die JDBC-API 4.0, die die Datentypen SQLXML und nationale Datentypen (Unicode), z. B. NCHAR, NVARCHAR, LONGNVARCHAR und NCLOB.

Datentypzuordnungen

Die folgende Tabelle enthält eine Liste der Standardzuordnungen zwischen den SQL Server-Standarddatentypen, den JDBC-Datentypen und den von der Programmiersprache Java verwendeten Datentypen:

SQL Server-Typen JDBC-Typen (java.sql.Types) Java-Typen
BIGINT bigint long
BINARY BINARY byte[]
bit BIT boolean
char CHAR String
date DATE java.sql.Date
datetime3 timestamp java.sql.Timestamp
datetime2 timestamp java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
Decimal DECIMAL java.math.BigDecimal
float Double double
image LONGVARBINARY byte[]
INT INTEGER INT
money DECIMAL java.math.BigDecimal
NCHAR CHAR

NCHAR (Java SE 6.0)
String
ntext LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String
NUMERIC NUMERIC java.math.BigDecimal
NVARCHAR VARCHAR

NVARCHAR (Java SE 6.0)
String
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
String
real real float
smalldatetime timestamp java.sql.Timestamp
SMALLINT SMALLINT short
SMALLMONEY DECIMAL java.math.BigDecimal
text LONGVARCHAR String
time TIME1 java.sql.Time1
timestamp BINARY byte[]
TINYINT TINYINT short
udt VARBINARY byte[]
UNIQUEIDENTIFIER CHAR String
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR String
varchar(max) VARCHAR String
Xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
Geometrie VARBINARY byte[]
geography VARBINARY byte[]

1 Zur Verwendung von java.sql.Time mit dem Zeittyp SQL Server müssen Sie die Verbindungseigenschaft sendTimeAsDatetime auf „false“ festlegen.

2 Sie können mit der DateTimeOffset-Klasse programmgesteuert auf die Werte von datetimeoffset zugreifen.

3 Beachten Sie, dass die java.sql.Timestamp-Werte ab SQL Server 2016 nicht mehr zum Vergleichen von Werten aus einer datetime-Spalte verwendet werden können. Diese Einschränkung ist auf eine serverseitige Änderung zurückzuführen, durch die „datetime“ auf andere Weise in „datetime2“ konvertiert wird, wodurch die Werte nicht äquivalent sind. Sie können dieses Problem umgehen, indem Sie entweder die datetime-Spalten in „datetime2(3)“ ändern, „Zeichenfolge“ anstelle von java.sql.Timestamp verwenden oder den Datenbankkompatibilitätsgrad mindestens auf 120 herabsetzen.

Die folgenden Abschnitte enthalten Beispiele für die Verwendung des JDBC-Treibers und der Standarddatentypen. Ein ausführlicheres Beispiel für die Verwendung der Standarddatentypen in einer Java-Anwendung finden Sie unter Standarddatentypen – Beispiel.

Abrufen von Daten als Zeichenfolge

Wenn Sie Daten aus einer Datenquelle abrufen müssen, die einem der JDBC-Standarddatentypen zugeordnet ist und als Zeichenfolge angezeigt werden soll, oder wenn stark typisierte Daten nicht erforderlich sind, können Sie die getString-Methode der SQLServerResultSet-Klasse verwenden. Dies wird im folgenden Beispiel veranschaulicht:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getString("job_id");
}

Abrufen von Daten nach Datentyp

Wenn Sie Daten aus einer Datenquelle abrufen müssen und den Typ der abgerufenen Daten kennen, verwenden Sie eine der get<Typ>-Methoden der SQLServerResultSet-Klasse, die auch als getter-Methoden bezeichnet werden. Sie können bei den get<Typ>-Methoden einen Spaltennamen oder einen Spaltenindex verwenden, wie im Folgenden dargestellt:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getShort("job_id");
}

Hinweis

Die Methoden getUnicodeStream und getBigDecimal mit Skalierung sind veraltet und werden vom JDBC-Treiber nicht unterstützt.

Aktualisieren von Daten nach Datentyp

Wenn Sie den Wert eines Felds in einer Datenquelle aktualisieren müssen, verwenden Sie eine der update<Typ>-Methoden der SQLServerResultSet-Klasse. Im folgenden Beispiel wird die updateInt-Methode zusammen mit der updateRow-Methode verwendet, um die Daten in der Datenquelle zu aktualisieren:

try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    int empJobID = rs.getInt(2);
    empJobID++;
    rs.first();
    rs.updateInt(2, empJobID);
    rs.updateRow();
}

Hinweis

Der JDBC-Treiber kann keine SQL Server-Spalte mit einem Spaltennamen aktualisieren, dessen Länge mehr als 127 Zeichen beträgt. Wenn ein Update einer Spalte, deren Name mehr als 127 Zeichen umfasst, ausgeführt werden soll, wird eine Ausnahme ausgegeben.

Aktualisieren von Daten durch parametrisierte Abfragen

Wenn Sie Daten in einer Datenquelle durch eine parametrisierte Abfrage aktualisieren müssen, können Sie den Datentyp der Parameter mit einer der set<Typ>-Methoden der SQLServerPreparedStatement-Klasse festlegen, die auch als setter-Methoden bezeichnet werden. Diese Methoden werden auch als Setter-Methoden bezeichnet. Im folgenden Beispiel wird die parametrisierte Abfrage mit der prepareStatement-Methode vorkompiliert, dann wird die setString-Methode verwendet, um vor dem Aufrufen der executeUpdate-Methode den string-Wert des Parameters festzulegen.

try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
    String name = "Bob";
    pstmt.setString(1, name);
    int rowCount = pstmt.executeUpdate();
}

Weitere Informationen zu parametrisierten Abfragen finden Sie unter Verwenden einer SQL-Anweisung mit Parametern.

Übergeben von Parametern an gespeicherte Prozeduren

Wenn Sie typisierte Parameter an eine gespeicherte Prozedur übergeben müssen, können Sie die Parameter mit einer der set<Typ>-Methoden der SQLServerCallableStatement-Klasse nach Namen oder Index festlegen. Im folgenden Beispiel wird der Aufruf der gespeicherten Prozedur mit der prepareCall-Methode eingerichtet, dann wird die setString-Methode verwendet, um vor dem Aufrufen der executeQuery-Methode den Parameter für den Aufruf festzulegen.

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
}

Hinweis

In diesem Beispiel wird ein Resultset zurückgegeben, das die Ergebnisse der gespeicherten Prozedur enthält.

BigDecimal

Bei Verwendung von BigDecimal-Parameterwerten können Genauigkeit und Skalierung zusammen mit dem Wert an setBigDecimal übergeben werden. Durch die Verwendung von setBigDecimal wird eine mögliche Wertabschneidung vermieden. Wenn die Verbindungszeichenfolgenoption calcBigDecimalPrecision auf true festgelegt ist, berechnet der Treiber die Genauigkeit für die BigDecimal-Eingabe für den Benutzer auf Kosten der Leistung. Wenn der Wert ohne Einstellung von calcBigDecimalPrecision oder Einstellung der Option auf false allein übergeben wird, nimmt der Treiber den maximal zulässigen Wert (38) für die Genauigkeit für diesen BigDecimal-Wert an.

Weitere Informationen zum Verwenden des JDBC-Treibers mit gespeicherten Prozeduren und Eingabeparametern finden Sie unter Verwenden von gespeicherten Prozeduren mit Eingabeparametern.

Abrufen von Parametern von gespeicherten Prozeduren

Wenn Sie Parameter aus einer gespeicherten Prozedur heranholen müssen, müssen Sie zunächst einen out Parameter nach Name oder Index registrieren, indem Sie die Methode registerOutParameter der Klasse SQLServerCallableStatement verwenden. Weisen Sie dann den zurückgegebenen Parameter einer entsprechenden Variablen zu, nachdem Sie den Aufruf der gespeicherten Prozedur ausgeführt haben. Im folgenden Beispiel wird der Aufruf der gespeicherten Prozedur mit der prepareCall-Methode eingerichtet, mit der registerOutParameter-Methode wird der out-Parameter eingerichtet, und dann wird die setString-Methode verwendet, um vor dem Aufruf der executeQuery-Methode den Parameter für den Aufruf festzulegen. Der vom out-Parameter der gespeicherten Prozedur zurückgegebene Wert wird mit der getShort-Methode abgerufen.

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
    cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
    short empJobID = cstmt.getShort(2);
}

Hinweis

Zusätzlich zum zurückgegebenen out-Parameter kann auch ein Resultset zurückgegeben werden, das die Ergebnisse der gespeicherten Prozedur enthält.

Weitere Informationen zum Verwenden des JDBC-Treibers mit gespeicherten Prozeduren und Ausgabeparametern finden Sie unter Verwenden von gespeicherten Prozeduren mit Ausgabeparametern.

Weitere Informationen

Grundlegendes zu den Datentypen des JDBC-Treibers