Verwenden von erweiterten Datentypen

Microsoft SQL Server JDBC Driver verwendet die erweiterten JDBC-Datentypen für die Konvertierung der SQL Server-Datentypen in ein Format, das von Java verarbeitet werden kann.

Die folgende Tabelle enthält eine Liste der Standardzuordnungen zwischen den erweiterten SQL Server-Datentypen sowie den JDBC- und Java-Datentypen.

SQL Server-Typen JDBC-Typen (java.sql.Types) Java-Typen

varbinary(max)

image

LONGVARBINARY

byte[] (Standard), Blob, InputStream, String

text

varchar(max)

LONGVARCHAR

String (Standard), Clob, InputStream

ntext

nvarchar(max)

LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)

String (Standard), Clob, NClob (Java SE 6.0)

xml

LONGVARCHAR

SQLXML (Java SE 6.0)

String (Standard), InputStream, Clob, byte[], Blob, SQLXML (Java SE 6.0)

udt

VARBINARY

String (Standard), byte[], InputStream

Die folgenden Abschnitte enthalten Beispiele für die Verwendung des JDBC-Treibers und der erweiterten Datentypen.

BLOB-, CLOB- und NCLOB-Datentypen

Der JDBC-Treiber implementiert alle Methoden der java.sql.Blob-, java.sql.Clob- und java.sql.NClob-Schnittstellen.

Hinweis

CLOB-Werte können mit SQL Server 2005-Datentypen mit umfangreichen Werten verwendet werden. Insbesondere können CLOB-Typen mit den Datentypen varchar(max) und nvarchar(max), BLOB-Typen mit den Datentypen varbinary(max) und image sowie NCLOB-Typen mit ntext und nvarchar(max) verwendet werden.

Datentypen mit umfangreichen Werten

In früheren Versionen von SQL Server war bei der Verarbeitung von Datentypen mit umfangreichen Werten eine besondere Behandlung erforderlich. Bei Datentypen mit umfangreichen Werten handelt es sich um Datentypen, die die maximale Zeilengröße von 8 KB übersteigen. SQL Server enthält einen neuen Spezifizierer für varchar-, nvarchar- und varbinary-Datentypen, um die Speicherung von Werten mit einer Größe bis zu 2^31 Byte zu ermöglichen. Tabellenspalten und Transact-SQL-Variablen können varchar(max)-, nvarchar(max)- oder varbinary(max)-Datentypen angeben.

Die Verarbeitung von Typen mit umfangreichen Werten umfasst hauptsächlich das Abrufen aus einer Datenbank sowie das Hinzufügen zu einer Datenbank. Die folgenden Abschnitte beschreiben die verschiedenen Verfahren für diese Aufgaben.

Abrufen von Typen mit umfangreichen Werten aus einer Datenbank

Beim Abrufen eines nicht binären Datentyps mit umfangreichen Werten aus einer Datenbank, wie z. B. dem varchar(max)-Datentyp, besteht eine Vorgehensweise darin, diese Daten als Zeichendatenstrom zu lesen. Im folgenden Beispiel werden Daten mit der executeQuery-Methode der SQLServerStatement-Klasse aus der Datenbank abgerufen und als Resultset zurückgegeben. Anschließend werden die Daten mit umfangreichen Werten mit der getCharacterStream-Methode der SQLServerResultSet-Klasse aus dem Resultset gelesen.

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);

Hinweis

Diese Vorgehensweise kann auch für text-, ntext- und nvarchar(max)-Datentypen verwendet werden.

Beim Abrufen eines binären Datentyps mit umfangreichen Werten aus einer Datenbank, wie z. B. dem varbinary(max)-Datentyp, gibt es mehrere mögliche Verfahren. Die effizienteste Vorgehensweise besteht darin, die Daten als Binärdatenstrom zu lesen, wie z. B.:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);

Sie können die Daten auch mit der getBytes-Methode als Bytearray lesen, wie z. B.:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);

Hinweis

Die Daten können auch als BLOB gelesen werden. Diese Vorgehensweise ist jedoch weniger effizient als die beiden oben erwähnten Methoden.

Hinzufügen von Typen mit umfangreichen Werten zu einer Datenbank

Das Hochladen von umfangreichen Daten mit dem JDBC-Treiber funktioniert problemlos, wenn die Daten in den Arbeitsspeicher passen. Wenn der Umfang der Daten größer ist als der Arbeitsspeicher, sollte Streaming verwendet werden. Die effizienteste Möglichkeit für das Hochladen von umfangreichen Daten bilden die stream-Schnittstellen.

Es besteht auch die Möglichkeit, eine Zeichenfolge oder Bytes zu verwenden, wie z. B.:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();

Hinweis

Diese Vorgehensweise kann auch für Werte verwendet werden, die in text-, ntext- und nvarchar(max)-Spalten gespeichert sind.

Wenn auf dem Server eine Bildbibliothek vorhanden ist und alle binären Bilddateien in eine varbinary(max)-Spalte geladen werden müssen, besteht die effizienteste Methode des JDBC-Treibers darin, direkt Datenströme zu verwenden, wie z. B.:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)");
File inputFile = new File("CLOBFile20mb.jpg");
FileInputStream inStream = new FileInputStream(inputFile);
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
inStream.close();

Hinweis

Das Hochladen von umfangreichen Daten mit der CLOB- oder BLOB-Methode ist nicht effizient.

Ändern von Typen mit umfangreichen Werten in einer Datenbank

In den meisten Fällen wird empfohlen, zum Aktualisieren oder Ändern von umfangreichen Werten in der Datenbank mit Transact-SQL-Befehlen wie UPDATE, WRITE und SUBSTRING Parameter über die SQLServerPreparedStatement- und SQLServerCallableStatement-Klassen zu übergeben.

Wenn Sie in einer umfangreichen Textdatei ein Wort ersetzen müssen, z. B. in einer archivierten HTML-Datei, können Sie ein Clob-Objekt verwenden, wie z. B.:

String SQL = "SELECT * FROM test1;";
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(SQL);
rs.next();

Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(pos, "cat");
rs.updateClob(2, clob);
rs.updateRow();

Darüber hinaus besteht die Möglichkeit, die gesamte Arbeit auf dem Server auszuführen und lediglich Parameter an eine vorbereitete UPDATE-Anweisung zu übergeben.

Weitere Informationen zu Typen mit umfangreichen Werten finden Sie in der SQL Server-Onlinedokumentation unter "Verwenden von Datentypen mit umfangreichen Werten".

XML-Datentyp

Ab SQL Server 2005 stellt SQL Server einen xml-Datentyp bereit, mit dem Sie XML-Dokumente und -Fragmente in einer SQL Server-Datenbank speichern können. Der xml-Datentyp ist ein integrierter Datentyp in SQL Server und ähnelt in gewisser Weise anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den xml-Datentyp beim Erstellen einer Tabelle als Spaltentyp, als Variablentyp, als Parametertyp oder als Funktionsrückgabetyp bzw. in Transact-SQL CAST- und CONVERT-Funktionen verwenden.

Im JDBC-Treiber kann der xml-Datentyp als Zeichenfolge-, Bytearray-, Datenstrom-, CLOB-, BLOB- oder SQLXML-Objekt zugeordnet werden. Der Standard lautet Zeichenfolge. Ab JDBC Driver, Version 2.0, unterstützt der JDBC-Treiber die JDBC 4.0-API, in der die SQLXML-Schnittstelle eingeführt wurde. Die SQLXML-Schnittstelle definiert Methoden für die Interaktion mit und die Bearbeitung von XML-Daten. Der SQLXML-Typ entspricht dem SQL Server-Datentyp xml. Weitere Informationen über das Lesen und Schreiben von XML-Daten in bzw. aus einer relationalen Datenbank mit dem SQLXML-Java-Datentyp finden Sie unter Unterstützen von XML-Daten.

Die Implementierung des xml-Datentyps im JDBC-Treiber ermöglicht Folgendes:

  • Zugriff auf XML-Daten als normale Java UTF-16-Zeichenfolge bei den gebräuchlichsten Programmierszenarien

  • Eingabe von UTF-8- und anderen 8-Bit-codierten XML-Daten

  • Zugriff auf XML-Daten als Bytearray mit führender Bytereihenfolgemarke (Byte Order Mark, BOM) bei Codierung in UTF-16 für den Austausch mit anderen XML-Prozessoren und Datenträgerdateien

SQL Server setzt eine führende BOM für UTF-16-codierte XML-Daten voraus. Die Anwendung muss diese Marke bereitstellen, wenn XML-Parameterwerte als Bytearrays übergeben werden. SQL Server gibt XML-Werte immer als UTF-16-Zeichenfolgen ohne BOM oder eingebettete Codierungsdeklaration aus. Wenn XML-Werte als "byte[]", "BinaryStream" oder "Blob" abgerufen werden, steht vor dem Wert ein UTF-16-BOM.

Weitere Informationen zum xml-Datentyp finden Sie in der SQL Server-Onlinedokumentation unter "XML-Datentyp".

Benutzerdefinierte Datentypen

Das SQL-Typensystem wird durch Einführung von benutzerdefinierten Typen (UDTs, User-defined Types) in SQL Server 2005 erweitert, sodass Sie Objekte und benutzerdefinierte Datenstrukturen in einer SQL Server-Datenbank speichern können. UDTs können mehrere Datentypen enthalten und Verhalten aufweisen, die sich von den herkömmlichen Aliasdatentypen unterscheiden, die aus einem einzigen SQL Server-Systemdatentyp bestehen. UDTs werden mit einer der von der Microsoft .NET Common Language Runtime (CLR) unterstützten Sprachen definiert, die überprüfbaren Code erzeugen. Dazu gehören Visual C# und Visual Basic .NET. Die Daten werden als Felder und Eigenschaften einer .NET Framework-basierten Klasse oder Struktur offen gelegt. Die Verhalten werden durch Methoden der Klasse bzw. Struktur definiert.

In SQL Server kann ein UDT als Spaltendefinition einer Tabelle, als Variable in einem Transact-SQL-Batch oder als Argument einer Transact-SQL-Funktion oder gespeicherten Prozedur verwendet werden.

Weitere Informationen zu benutzerdefinierten Datentypen finden Sie in der SQL Server-Onlinedokumentation unter "Verwenden und Ändern von Instanzen von benutzerdefinierten Typen".

Siehe auch

Andere Ressourcen

Grundlegendes zu den Datentypen in JDBC Driver