Beispiel zum Aktualisieren umfangreicher Daten
Diese Beispielanwendung für den Microsoft JDBC-Treiber für SQL Server zeigt, wie Sie eine große Spalte in einer Datenbank aktualisieren.
Die Codedatei für dieses Beispiel heißt „UpdateLargeData.java“ und befindet sich unter folgendem Pfad:
\<installation directory>\sqljdbc_<version>\<language>\samples\adaptive
Requirements (Anforderungen)
Zum Ausführen dieser Beispielanwendung benötigen Sie Zugriff auf die AdventureWorks2022-Beispieldatenbank. Außerdem müssen Sie die Datei "sqljdbc4.jar" in den Klassenpfad aufnehmen. Wenn im Klassenpfad kein Eintrag für "sqljdbc4.jar" vorhanden ist, löst die Beispielanwendung die allgemeine Ausnahme "Klasse nicht gefunden" aus. Weitere Informationen zum Festlegen des Klassenpfads finden Sie unter mit dem JDBC-Treiber.
Hinweis
Der Microsoft JDBC-Treiber für SQL Server stellt die Klassenbibliotheksdateien sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar oder sqljdbc42.jar zur Verfügung, die Sie je nach den Einstellungen Ihrer bevorzugten Java-Laufzeitumgebung (JRE) verwenden können. In diesem Beispiel werden die in der JDBC 4.0-API neu eingeführten Methoden isWrapperFor und unwrap für den Zugriff auf die treiberspezifischen Antwortpuffermethoden verwendet. Zum Kompilieren und Ausführen dieses Beispiels benötigen Sie die "sqljdbc4.jar"-Klassenbibliothek, die die Unterstützung für JDBC 4.0 bereitstellt. Weitere Informationen zum Auswählen der richtigen JAR-Datei finden Sie unter Systemanforderungen für den JDBC-Treiber.
Beispiel
Im folgenden Beispielcode wird eine Verbindung mit der AdventureWorks2022-Datenbank hergestellt. Danach wird ein Statement-Objekt erstellt und mithilfe der isWrapperFor-Methode überprüft, ob das Statement-Objekt ein Wrapper für die angegebene SQLServerStatement-Klasse ist. Die unwrap-Methode wird für den Zugriff auf treiberspezifische Antwortpuffermethoden verwendet.
Dann wird der Antwortpuffermodus mithilfe der setResponseBuffering-Methode der SQLServerStatement-Klasse auf Adaptiv festgelegt und veranschaulicht, wie der Modus für die adaptive Pufferung abgerufen wird.
Anschließend wird die SQL-Anweisung ausgeführt, und die zurückgegebenen Daten werden in ein aktualisierbares SQLServerResultSet-Objekt eingefügt.
Schließlich werden die Datenzeilen im Resultset durchlaufen. Wenn eine leere Dokumentzusammenfassung erkannt wird, wird die Datenzeile mit einer Kombination aus updateString-Methode und updateRow-Methode aktualisiert und erneut in der Datenbank gespeichert. Wenn bereits Daten vorhanden sind, werden einige der Daten mithilfe der getString-Methode angezeigt.
Das Standardverhalten des Treibers ist auf "adaptive" festgelegt. Für das aktualisierbare Resultset mit Vorwärtscursor und bei Daten, deren Größe die des Anwendungsspeichers übersteigt, muss der Modus für die adaptive Pufferung von der Anwendung jedoch explizit mithilfe der setResponseBuffering-Methode der SQLServerStatement-Klasse festgelegt werden.
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerStatement;
public class UpdateLargeData {
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://<server>:<port>;databaseName=AdventureWorks;user=<user>;password=<password>";
// Establish the connection.
try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();
Statement stmt1 = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);) {
createTable(stmt);
// Since the summaries could be large, we should make sure that
// the driver reads them incrementally from a database,
// even though a server cursor is used for the updatable result sets.
// The recommended way to access the Microsoft JDBC Driver for SQL Server
// specific methods is to use the JDBC 4.0 Wrapper functionality.
// The following code statement demonstrates how to use the
// Statement.isWrapperFor and Statement.unwrap methods
// to access the driver specific response buffering methods.
if (stmt.isWrapperFor(com.microsoft.sqlserver.jdbc.SQLServerStatement.class)) {
SQLServerStatement SQLstmt = stmt.unwrap(com.microsoft.sqlserver.jdbc.SQLServerStatement.class);
SQLstmt.setResponseBuffering("adaptive");
System.out.println("Response buffering mode has been set to " + SQLstmt.getResponseBuffering());
}
// Select all of the document summaries.
try (ResultSet rs = stmt1.executeQuery("SELECT Title, DocumentSummary FROM Document_JDBC_Sample")) {
// Update each document summary.
while (rs.next()) {
// Retrieve the original document summary.
try (Reader reader = rs.getCharacterStream("DocumentSummary")) {
if (reader == null) {
// Update the document summary.
System.out.println("Updating " + rs.getString("Title"));
rs.updateString("DocumentSummary", "Work in progress");
rs.updateRow();
}
}
}
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
}
private static void createTable(Statement stmt) throws SQLException {
stmt.execute("if exists (select * from sys.objects where name = 'Document_JDBC_Sample')"
+ "drop table Document_JDBC_Sample");
String sql = "CREATE TABLE Document_JDBC_Sample (" + "[DocumentID] [int] NOT NULL identity,"
+ "[Title] [char](50) NOT NULL," + "[DocumentSummary] [varchar](max) NULL)";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample VALUES ('title1','summary1') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample (title) VALUES ('title2') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample (title) VALUES ('title3') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample VALUES ('title4','summary3') ";
stmt.execute(sql);
}
}