Grundlegendes zu Datentypkonvertierungen

Um eine Konvertierung der Datentypen der Programmiersprache Java in SQL Server-Datentypen zu ermöglichen, stellt Microsoft SQL Server JDBC Driver die erforderlichen Datentypkonvertierungen gemäß der JDBC-Spezifikation bereit. Alle Typen können in die und aus den Datentypen Object, String und byte[] konvertiert werden, um mehr Flexibilität bereitzustellen.

Konvertierungen für Abrufmethoden

Das folgende Diagramm enthält auf Grundlage der SQL Server-Datentypen das Konvertierungsschema des JDBC-Treibers für die get<Type>()-Methoden der SQLServerResultSet-Klasse und die unterstützten Konvertierungen für die get<Type>-Methoden der SQLServerCallableStatement-Klasse.

JDBCGetterConversions

Von den Abrufmethoden des JDBC-Treibers werden drei Konvertierungskategorien unterstützt:

  • Verlustfrei (x): Konvertierungen für Fälle, bei denen der Abruftyp gleich oder kleiner als der zugrunde liegende Servertyp ist. Beim Aufruf von getBigDecimal für eine zugrunde liegende dezimale Serverspalte ist beispielsweise keine Konvertierung erforderlich.

  • Konvertiert (y): Konvertierungen von numerischen Servertypen in Java-Typen, bei denen die Konvertierung entsprechend den Java-Konvertierungsregeln erfolgt. Bei diesen Konvertierungen wird die Genauigkeit gekürzt (niemals gerundet), und der Überlauf wird als Modulo des Zieltyps behandelt, der kleiner ist. Beim Aufruf von getInt für eine zugrunde liegende decimal-Spalte mit dem Wert "1,9999" wird der Wert "1" zurückgegeben. Beim zugrunde liegenden decimal-Wert "3000000000" beträgt der Überlauf des int-Werts "-1294967296".

  • Datenabhängig (z): Bei Konvertierungen von zugrunde liegenden Zeichentypen in numerische Typen müssen die Zeichentypen Werte enthalten, die in den betreffenden Typ konvertiert werden können. Andere Konvertierungen werden nicht ausgeführt. Werte, die für den Abruftyp zu groß sind, sind ungültig. Beim Aufruf von getInt für eine varchar(50)-Spalte, die "53" enthält, wird beispielsweise der Wert als int zurückgegeben. Bei einem zugrunde liegenden Wert von "xyz" oder "3000000000" wird ein Fehler ausgegeben.

Wenn getString für einen Spaltendatentyp binary, varbinary, varbinary(max) oder image aufgerufen wird, wird der Wert als hexadezimaler Zeichenfolgenwert zurückgegeben.

Konvertierungen für Aktualisierungsmethoden

Für die Java-Typdaten, die an die update<Type>()-Methoden der SQLServerResultSet-Klasse übergeben werden, gelten die folgenden Konvertierungen.

JDBCUpdaterConversions

Von den Aktualisierungsmethoden des JDBC-Treibers werden drei Konvertierungskategorien unterstützt:

  • Verlustfrei (x): Konvertierungen für Fälle, bei denen der Aktualisierungstyp gleich oder kleiner als der zugrunde liegende Servertyp ist. Beim Aufruf von updateBigDecimal für eine zugrunde liegende dezimale Serverspalte ist beispielsweise keine Konvertierung erforderlich.

  • Konvertiert (y): Konvertierungen von numerischen Servertypen in Java-Typen, bei denen die Konvertierung entsprechend den Java-Konvertierungsregeln erfolgt. Bei diesen Konvertierungen wird die Genauigkeit gekürzt (niemals gerundet), und der Überlauf wird als Modulo des (kleineren) Zieltyps behandelt. Beim Aufruf von updateDecimal für eine zugrunde liegende int-Spalte mit dem Wert "1,9999" wird der Wert "1" zurückgegeben. Beim zugrunde liegenden decimal-Wert "3000000000" beträgt der Überlauf des int-Werts "-1294967296".

  • Datenabhängig (z): Bei Konvertierungen von zugrunde liegenden Quelldatentypen in Zieldatentypen müssen die enthaltenen Werte in die Zieltypen konvertiert werden können. Andere Konvertierungen werden nicht ausgeführt. Werte, die für den Abruftyp zu groß sind, sind ungültig. Beispielsweise wird die Aktualisierung bei einem Aufruf von updateString für eine int-Spalte, die "53" enthält, erfolgreich ausgeführt. Bei einem zugrunde liegenden String-Wert von "foo" oder "3000000000" wird ein Fehler ausgelöst.

Wenn updateString für einen Spaltendatentyp binary, varbinary, varbinary(max) oder image aufgerufen wird, wird der String-Wert als hexadezimaler Zeichenfolgenwert behandelt.

Wenn der Datentyp der SQL Server-Spalte XML ist, muss der Datenwert gültiges XML sein. Beim Aufrufen der Methoden updateBytes, updateBinaryStream oder updateBlob sollte der Datenwert die hexadezimale Zeichenfolgendarstellung der XML-Zeichen sein. Beispiel:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E 

Beachten Sie, dass eine Bytereihenfolge-Marke (BOM) erforderlich ist, wenn die XML-Zeichen in einer bestimmten Zeichencodierung vorliegen.

Konvertierungen für Festlegungsmethoden

Für die Java-Typdaten, die an die set<Type>()-Methoden der SQLServerPreparedStatement-Klasse und der SQLServerCallableStatement-Klasse übergeben werden, gelten die folgenden Konvertierungen.

JDBCSetterConversions

Der Server versucht alle Konvertierungen und gibt bei Fehlern eine Fehlermeldung zurück.

Wenn der Wert eines String-Datentyps die Länge von VARCHAR überschreitet, wird er LONGVARCHAR zugeordnet. Entsprechend wird ein NVARCHAR, dessen Wert die Länge von NVARCHAR überschreitet, LONGNVARCHAR zugeordnet. Gleiches gilt für byte[]. Werte, die länger als VARBINARY sind, werden in LONGVARBINARY konvertiert.

Von den Festlegungsmethoden des JDBC-Treibers werden zwei Konvertierungskategorien unterstützt:

  • Verlustfrei (x): Konvertierungen für numerische Fälle, bei denen der Festlegungstyp gleich oder kleiner als der zugrunde liegende Servertyp ist. Beim Aufruf von setBigDecimal für eine zugrunde liegende decimal-Serverspalte ist beispielsweise keine Konvertierung erforderlich. Bei der Umwandlung von numerischen Typen in Zeichentypen wird der Java-Datentyp numeric in String konvertiert. Beim Aufruf von setDouble für eine varchar(50)-Spalte mit dem Wert "53" wird beispielsweise in der betreffenden Zielspalte der Zeichenwert "53" erzeugt.

  • Konvertiert (y): Konvertierungen eines numeric-Java-Typs in einen zugrunde liegenden numeric-Servertyp, der kleiner ist. Diese Konvertierung ist regulär und erfolgt entsprechend den SQL Server-Konvertierungskonventionen. Die Genauigkeit wird immer gekürzt (niemals gerundet). Bei einem Überlauf wird der Fehler ausgegeben, dass die Konvertierung nicht unterstützt wird. Beispielsweise führt updateDecimal mit einem Wert von "1,9999" für eine zugrunde liegende integer-Spalte zu einer "1" in der Zielspalte. Bei Übergabe von "3000000000" löst der Treiber jedoch einen Fehler aus.

  • Datenabhängig (z): Konvertierungen eines Java-String-Typs in den zugrunde liegenden SQL Server-Datentyp unterliegen den folgenden Bedingungen: Der Treiber sendet den String-Wert an SQL Server, und SQL Server führt Konvertierungen bei Bedarf aus. Wenn sendStringParametersAsUnicode auf "true" festgelegt ist und der zugrunde liegende SQL Server-Datentyp image ist, lässt SQL Server keine Konvertierung von nvarchar in image zu und löst eine SQLServerException aus. Wenn sendStringParametersAsUnicode auf "false" festgelegt ist und der zugrunde liegende SQL Server-Datentyp image ist, lässt SQL Server eine Konvertierung von varchar in image zu und löst keine Ausnahme aus.

SQL Server führt die Konvertierungen aus und übergibt Fehler bei Problemen wieder an den JDBC-Treiber.

Wenn der Datentyp der SQL Server-Spalte XML ist, muss der Datenwert gültiges XML sein. Beim Aufrufen der Methoden updateBytes, updateBinaryStream oder updateBlob sollte der Datenwert die hexadezimale Zeichenfolgendarstellung der XML-Zeichen sein. Beispiel:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E 

Beachten Sie, dass eine Bytereihenfolge-Marke (BOM) erforderlich ist, wenn die XML-Zeichen in einer bestimmten Zeichencodierung vorliegen.

Konvertierungen für setObject

Für die Java-Typdaten, die an die setObject(<Type>)-Methoden der SQLServerPreparedStatement-Klasse übergeben werden, gelten die folgenden Konvertierungen.

JDBCSetObjectConversions

Die setObject-Methode ohne Angabe eines Zieltyps verwendet die Standardzuordnung. Wenn der Wert eines String-Datentyps die Länge von VARCHAR überschreitet, wird er LONGVARCHAR zugeordnet. Entsprechend wird ein NVARCHAR, dessen Wert die Länge von NVARCHAR überschreitet, LONGNVARCHAR zugeordnet. Gleiches gilt für byte[]. Werte, die länger als VARBINARY sind, werden in LONGVARBINARY konvertiert.

Von den setObject-Methoden des JDBC-Treibers werden drei Konvertierungskategorien unterstützt:

  • Verlustfrei (x): Konvertierungen für numerische Fälle, bei denen der Festlegungstyp gleich oder kleiner als der zugrunde liegende Servertyp ist. Beim Aufruf von setBigDecimal für eine zugrunde liegende decimal-Serverspalte ist beispielsweise keine Konvertierung erforderlich. Bei der Umwandlung von numerischen Typen in Zeichentypen wird der Java-Datentyp numeric in String konvertiert. Beim Aufruf von setDouble für eine varchar(50)-Spalte mit dem Wert "53" wird beispielsweise in der betreffenden Zielspalte der Zeichenwert "53" erzeugt.

  • Konvertiert (y): Konvertierungen eines numeric-Java-Typs in einen zugrunde liegenden numeric-Servertyp, der kleiner ist. Diese Konvertierung ist regulär und erfolgt entsprechend den SQL Server-Konvertierungskonventionen. Die Genauigkeit wird immer gekürzt (niemals gerundet). Bei einem Überlauf wird der Fehler ausgegeben, dass die Konvertierung nicht unterstützt wird. Beispielsweise führt updateDecimal mit einem Wert von "1,9999" für eine zugrunde liegende integer-Spalte zu einer "1" in der Zielspalte. Bei Übergabe von "3000000000" löst der Treiber jedoch einen Fehler aus.

  • Datenabhängig (z): Konvertierungen eines Java-String-Typs in den zugrunde liegenden SQL Server-Datentyp unterliegen den folgenden Bedingungen: Der Treiber sendet den String-Wert an SQL Server, und SQL Server führt Konvertierungen bei Bedarf aus. Wenn die sendStringParametersAsUnicode-Verbindungseigenschaft auf "true" festgelegt ist und der zugrunde liegende SQL Server-Datentyp image ist, lässt SQL Server keine Konvertierung von nvarchar in image zu und löst eine SQLServerException aus. Wenn sendStringParametersAsUnicode auf "false" festgelegt ist und der zugrunde liegende SQL Server-Datentyp image ist, lässt SQL Server eine Konvertierung von varchar in image zu und löst keine Ausnahme aus.

SQL Server führt den Großteil der Festlegungskonvertierungen aus und gibt bei Problemen Fehler an den JDBC-Treiber zurück. Clientseitige Konvertierungen sind die Ausnahme und werden nur bei date-, time-, timestamp-, Boolean- und String-Werten ausgeführt.

Wenn der Datentyp der SQL Server-Spalte XML ist, muss der Datenwert gültiges XML sein. Beim Aufrufen der Methoden setObject(byte[], SQLXML), setObject(inputStream, SQLXML) oder setObject(Blob, SQLXML) sollte der Datenwert die hexadezimale Zeichenfolgendarstellung der XML-Zeichen sein. Beispiel:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E 

Beachten Sie, dass eine Bytereihenfolge-Marke (BOM) erforderlich ist, wenn die XML-Zeichen in einer bestimmten Zeichencodierung vorliegen.

Siehe auch

Andere Ressourcen

Grundlegendes zu den Datentypen in JDBC Driver