Beispiel zum Aktualisieren umfangreicher Daten
Diese Beispielanwendung für Microsoft SQL Server JDBC Driver veranschaulicht, wie eine umfangreiche Spalte in einer Datenbank aktualisiert wird.
Die Codedatei für dieses Beispiel heißt updateLargeData.java und befindet sich unter folgendem Pfad:
<Installationsverzeichnis>\sqljdbc_<Version>\<Sprache>\help\samples\adaptive
Anforderungen
Zum Ausführen dieser Beispielanwendung benötigen Sie Zugriff auf die SQL Server 2005 AdventureWorks-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 Verwenden des JDBC-Treibers.
Hinweis
Microsoft SQL Server JDBC Driver, Version 2.0, enthält die Klassenbibliotheksdateien sqljdbc.jar und sqljdbc4.jar für die jeweilige Verwendung mit den bevorzugten JRE (Java Runtime Environment)-Einstellungen. 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
Der folgende Beispielcode stellt eine Verbindung zur SQL Server 2005 AdventureWorks-Datenbank her. 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 "adaptive" 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 durchlaufen, die im Resultset enthalten sind. 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 enthaltenen Daten mithilfe der getString-Methode angezeigt.
Beachten Sie, dass ab Version 2.0 von JDBC Driver das Standardverhalten des Treibers auf "adaptive." lautet. 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.sql.*;
import java.io.*;
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://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;";
// Declare the JDBC objects.
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Reader reader = null;
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
// Since the summaries could be large, 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 SQL Server JDBC Driver
// 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.
rs = stmt.executeQuery("SELECT Title, DocumentSummary FROM Production.Document");
// Update each document summary.
while (rs.next()) {
// Retrieve the original document summary.
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();
}
else
{
// Do something with the chunk of the data that was
// read.
System.out.println("reading " + rs.getString("Title"));
reader.close();
reader = null;
}
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (reader != null) try { reader.close(); } catch(Exception e) {}
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
}
}