Udostępnij przez


Aktualizowanie dużej próbki danych

pobierz sterownik JDBC

Ten przykładowy sterownik JDBC firmy Microsoft dla programu SQL Server pokazuje, jak zaktualizować dużą kolumnę w bazie danych.

Plik kodu dla tego przykładu ma nazwę UpdateLargeData.java i można go znaleźć w następującej lokalizacji:

\<installation directory>\sqljdbc_<version>\<language>\samples\adaptive

Requirements

Aby uruchomić tę przykładową aplikację, musisz mieć dostęp do przykładowej bazy danych AdventureWorks2025. Należy również ustawić ścieżkę klasy tak, aby zawierała plik sqljdbc4.jar. Jeśli w ścieżce classpath brakuje wpisu dla sqljdbc4.jar, przykładowa aplikacja zgłosi wspólny wyjątek "Nie znaleziono klasy". Aby uzyskać więcej informacji na temat ustawiania ścieżki klasy, zobacz Using the JDBC Driver (Używanie sterownika JDBC).

Uwaga / Notatka

Sterownik JDBC firmy Microsoft dla programu SQL Server udostępnia pliki biblioteki klas sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar lub sqljdbc42.jar, które mają być używane w zależności od preferowanych ustawień środowiska Java Runtime Environment (JRE). W tym przykładzie użyto metod isWrapperFor i unwrap , które zostały wprowadzone w interfejsie API JDBC 4.0, aby uzyskać dostęp do metod buforowania odpowiedzi specyficznych dla sterownika. Aby skompilować i uruchomić ten przykład, musisz mieć bibliotekę klas o nazwie sqljdbc4.jar, która zapewnia obsługę JDBC 4.0. Aby uzyskać więcej informacji na temat wybranego pliku JAR, zobacz Wymagania systemowe sterownika JDBC.

Example

W poniższym przykładzie przykładowy kod nawiązuje połączenie z bazą danych AdventureWorks2025. Następnie przykładowy kod tworzy obiekt Statement i używa metody isWrapperFor, aby sprawdzić, czy obiekt Statement jest opakowaniem dla określonej klasy SQLServerStatement. Metoda odpakowania służy do uzyskiwania dostępu do metod buforowania odpowiedzi specyficznych dla sterownika.

Następnie przykładowy kod ustawia tryb buforowania odpowiedzi jako "adaptacyjny" przy użyciu metody setResponseBuffering klasy SQLServerStatement , a także pokazuje, jak uzyskać tryb adaptacyjnego buforowania.

Następnie uruchamia instrukcję SQL i umieszcza dane zwracane do obiektu SQLServerResultSet z możliwością aktualizacji.

Na koniec przykładowy kod iteruje po wierszach danych znajdujących się w zestawie wyników. Jeśli znajdzie puste podsumowanie dokumentu, używa kombinacji metod updateString i updateRow w celu zaktualizowania wiersza danych i ponownego utrwalania go w bazie danych. Jeśli istnieją już dane, używa metody getString do wyświetlania niektórych danych.

Domyślne zachowanie sterownika jest "adaptacyjne". Jednak w przypadku zestawów wyników, które można aktualizować tylko do przodu, a gdy dane w zestawie wyników są większe niż pamięć aplikacji, aplikacja musi jawnie ustawić tryb adaptacyjnego buforowania przy użyciu metody setResponseBuffering klasy SQLServerStatement .

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);
    }
}

Zobacz także

Praca z dużymi danymi