Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Microsoft JDBC-Treiber für SQL Server verwendet die erweiterten JDBC-Datentypen, um die SQL Server-Datentypen in ein Format zu konvertieren, das von der Java-Programmiersprache verstanden wird.
Bemerkungen
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) |
Zeichenfolge (Standard), Clob, NClob |
| Xml | LONGVARCHAR SQLXML |
String (Standard), InputStream, Clob, Byte[], Blob, SQLXML |
| Udt1 | VARBINARY | String (Standard), byte[], InputStream |
| sqlvariant | SQLVARIANT | Object |
| Geometrie geography |
VARBINARY | byte[] |
| json | microsoft.sql.Types.JSON | Zeichenfolge (Standard), InputStream |
| Vektor | microsoft.sql.Types.VECTOR | microsoft.sql.Vector |
1 Der Microsoft JDBC-Treiber für SQL Server unterstützt zwar das Senden und Abrufen von CLR-UDTs als binäre Daten, jedoch können CLR-Metadaten nicht bearbeitet werden.
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 Datentypen von SQL Server 2005 (9.x) (oder höher) mit umfangreichen Werten verwendet werden. CLOB-Typen können spezifisch mit den Datentypen varchar(max) und nvarchar(max) , BLOB-Typen mit den Datentypen varbinary(max) und image und NCLOB-Typen können mit den Datentypen 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. Datentypen mit großem Wert sind Typen, die die maximale Zeilengröße von 8 KB überschreiten. SQL Server führt einen maximalen Bezeichner für die Datentypen varchar, nvarchar und varbinary ein, um das Speichern von Werten in der Größenordnung von bis zu 2^31 Byte zu ermöglichen. Tabellenspalten und Transact-SQL-Variablen können den Datentyp varchar(max), nvarchar(max) oder varbinary(max) 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
Wenn Sie einen nichtbinären Datentyp mit großem Wert abrufen, z. B. den Datentyp varchar(max) aus einer Datenbank, besteht ein Ansatz darin, diese Daten als Zeichenstrom 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
Dieselbe Vorgehensweise kann für die Datentypen text, ntext und nvarchar(max) verwendet werden.
Beim Abrufen eines binären Datentyps mit umfangreichen Werten aus einer Datenbank, z.B. dem Datentyp varbinary (max) , stehen Ihnen mehrere Vorgehensweisen zur Verfügung. Der effizienteste Ansatz besteht darin, die Daten als binären Datenstrom zu lesen, wie im folgenden Beispiel gezeigt:
ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);
Sie können die GetBytes-Methode auch verwenden, um die Daten als Bytearray zu lesen, wie im Beispiel gezeigt:
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. Das Lesen eines BLOB ist jedoch weniger effizient als die beiden zuvor gezeigten 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.
Die Verwendung einer Zeichenfolge oder Byte ist auch eine Option, wie im folgenden Beispiel gezeigt:
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 den Spalten text, ntext und nvarchar(max) gespeichert werden.
Wenn auf dem Server eine Bildbibliothek vorhanden ist und alle binären Bilddateien in eine varchar(max) -Spalte geladen werden müssen, besteht die effizienteste Methode des JDBC-Treibers darin, Datenströme wie folgt direkt zu verwenden:
try (PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)")) {
File inputFile = new File("CLOBFile20mb.jpg");
try (FileInputStream inStream = new FileInputStream(inputFile)) {
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
}
}
Hinweis
Die Verwendung der CLOB- oder BLOB-Methode ist keine effiziente Möglichkeit, große Daten hochzuladen.
Ä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 , und UPDATE Parameter über die Klassen WRITE und SUBSTRING zu übergeben.
Wenn Sie die Instanz eines Worts in einer großen Textdatei ersetzen müssen, z. B. eine archivierte HTML-Datei, können Sie wie im folgenden Beispiel ein Clob-Objekt verwenden:
String SQL = "SELECT * FROM test1;";
try (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
SQL Server 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 einigen Punkten anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den Datentyp xml beim Erstellen einer Tabelle als Spaltentyp, als Variablentyp, als Parametertyp oder als Funktionsrückgabetyp bzw. in den Transact-SQL-Funktionen CAST und CONVERT verwenden.
Im JDBC-Treiber kann der XML-Datentyp als Zeichenfolgen-, Bytearray-, Stream-, CLOB-, BLOB- oder SQLXML-Objekt zugeordnet werden. Der Standard lautet Zeichenfolge. Ab JDBC-Treiber Version 2.0 unterstützt der JDBC-Treiber die JDBC 4.0-API, die die SQLXML-Schnittstelle einführt. Die SQLXML-Schnittstelle definiert Methoden für die Interaktion mit und die Bearbeitung von XML-Daten. Der Datentyp SQLXML ist dem SQL Server-Datentypen xml zugeordnet. 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 die führende BOM bereitstellen, wenn XML-Parameterwerte als Bytearrays bereitgestellt werden. SQL Server gibt XML-Werte immer in Form von UTF-16-Zeichenfolgen ohne BOM oder eingebettete Codierungsdeklaration aus. Wenn XML-Werte als Byte[], BinaryStream oder Blob abgerufen werden, wird eine UTF-16-BOM dem Wert vorangestellt.
Weitere Informationen zum XML-Datentyp finden Sie in der SQL Server-Onlinedokumentation unter „XML-Datentyp“.
Benutzerdefinierter Datentyp
Das SQL-Typensystem wird durch Einführung von benutzerdefinierten Typen (UDTs, User-defined Types) in SQL Server 2005 (9.x) erweitert, sodass Sie Objekte und benutzerdefinierte Datenstrukturen in einer SQL Server-Datenbank speichern können. UDTs können mehrere Datentypen enthalten und Verhalten zeigen, das sie von den herkömmlichen Aliasdatentypen aus einem einzelnen SQL Server-Systemdatentyp unterscheidet. UDTs werden mithilfe einer der sprachen definiert, die von der Microsoft .NET Common Language Runtime (CLR) unterstützt werden, die überprüfbaren Code erzeugen, einschließlich Microsoft Visual C# und Visual Basic .NET. Die Daten werden als Felder und Eigenschaften einer .NET Framework-basierten Klasse oder -Struktur verfügbar gemacht, Methoden der Klasse oder Struktur definieren Verhaltensweisen.
In SQL Server kann ein UDT als Spaltendefinition einer Tabelle, als Variable in einem Transact-SQL-Batch oder als Argument einer TransactSQL-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“.
Sql_variant-Datentyp
Weitere Informationen über den Datentyp sql_variant finden Sie unter Verwenden des sql_variant-Datentyps.
Räumliche Datentypen
Informationen zu räumlichen Datentypen finden Sie unter Verwenden von räumlichen Datentypen.
JSON-Datentyp
Informationen zum JSON-Datentyp finden Sie unter JSON-Datentyp.
Vektordatentyp
Informationen zum Vektordatentyp finden Sie unter Vector-Datentyp.