Verwenden von erweiterten Datentypen

Die erweiterten JDBC-Datentypen wurden in der JDBC 2.0 Kern-API eingeführt. Microsoft SQL Server 2005 JDBC Driver verwendet die erweiterten JDBC-Datentypen für die Konvertierung der SQL Server-Datentypen in ein Format, das von Java verstanden 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, CharacterStream, BinaryStream, String

text

ntext

varchar(max)

nvarchar(max)

LONGVARCHAR

String (Standard), Clob, CharacterStream, BinaryStream

xml

LONGVARCHAR

String (Standard), CharacterStream, Clob, byte[], BinaryStream, Blob

udt

VARBINARY (max. Größe 8000 Byte)

String (Standard), byte[], BinaryStream, Object

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

BLOB- und CLOB-Datentypen

Der JDBC-Treiber implementiert alle JDBC 3.0-Methoden der java.sql.Blob- und java.sql.Clob-Schnittstellen. Mit diesen Methoden können Sie Spalten vom Typ text, ntext, xml und image abrufen und aktualisieren.

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) verwendet werden. BLOB-Typen können mit varbinary(max)- und xml-Datentypen verwendet werden.

Datentypen mit umfangreichen Werten

In den 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 2005 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 Zeichenstream 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ärstream 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 Streams zu verwenden, wie z. B.:

Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 
VALUES( ?, ? )");
FileReader in = new FileReader(new File("CLOBFile20mb.txt");
long len = fileIn.length();
int id = 1;
pstmt.setInt(1,id);
pstmt.setCharacterStream(2, in, (int)len);
pstmt.executeUpdate();
in.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.:

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test1");
rs.next();
Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(1, "cat", len, 3);
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 unter "Verwenden von Datentypen mit umfangreichen Werten" in der SQL Server-Onlinedokumentation.

XML-Datentyp

SQL Server 2005 umfasst einen xml-Datentyp, 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-, Stream-, CLOB- oder BLOB-Objekt zugeordnet werden. Standardmäßig erfolgt die Darstellung als Zeichenfolge. 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 eine UTF-16-BOM.

Hinweis

Das Lesen von Ausgabeparametern von gespeicherten Prozeduren mit xml-Datentyp wird vom JDBC-Treiber nicht unterstützt. Die Verwendung des xml-Datentyps für Eingabeparameter wird jedoch unterstützt. Wenn Sie den xml-Datentyp als Ausgabeparameter verwenden müssen, muss der xml-Datentyp in der gespeicherten Prozedur in VARCHAR oder LONGVARCHAR konvertiert werden, damit er gelesen werden kann.

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

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 Microsoft 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 2005 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.

Hinweis

Abruf- oder Festlegungsmethoden für AsciiStream- und CharacterStream-Methoden in UDT-Spalten werden vom JDBC-Treiber nicht unterstützt. Ähnlich wie beim XML-Datentyp wird außerdem das Lesen von Ausgabeparametern von gespeicherten Prozeduren mit UDT-Datentyp vom JDBC-Treiber nicht unterstützt. Die Verwendung des XML-Datentyps für Eingabeparameter wird jedoch unterstützt. Wenn Sie den UDT-Datentyp als Ausgabeparameter verwenden müssen, muss der UDT-Datentyp in der gespeicherten Prozedur in den Datentyp varbinary(max) konvertiert werden, damit er gelesen werden kann.

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

Siehe auch

Andere Ressourcen

Grundlegendes zu den Datentypen in JDBC Driver