更新大型数据的示例

下载 JDBC 驱动程序

此 Microsoft JDBC Driver for SQL Server 示例应用程序演示如何更新数据库中的大型列。

此示例的代码文件名为 UpdateLargeData.java,该文件可在以下位置找到:

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

要求

若要运行此示例应用程序,需要访问 AdventureWorks2022 示例数据库。 还必须将 classpath 设置为包含 sqljdbc4.jar 文件。 如果 classpath 缺少 sqljdbc4.jar 项,示例应用程序将引发“找不到类”的常见异常。 若要详细了解如何设置类路径,请参阅使用 JDBC 驱动程序

注意

Microsoft JDBC Driver for SQL Server 提供 sqljdbc.jar、sqljdbc4.jar、sqljdbc41.jar 或 sqljdbc42.jar 类库文件,具体使用哪个文件取决于首选的 Java Runtime Environment (JRE) 设置。 此示例使用 isWrapperForunwrap 方法,这两个方法是在 JDBC 4.0 API 中引入的,用于访问特定于驱动程序的响应缓冲方法。 为了编译和运行此示例,您需要对 JDBC 4.0 提供支持的 sqljdbc4.jar 类库。 有关选择哪个 JAR 文件的详细信息,请参阅 JDBC 驱动程序的系统要求

示例

在下面的示例中,示例代码建立与 AdventureWorks2022 数据库的连接。 接下来,示例代码创建一个 Statement 对象并使用 isWrapperFor 方法来检查 Statement 对象是否是指定的 SQLServerStatement 类的包装。 unwrap 方法用于访问特定于驱动程序的响应缓冲方法。

接下来,示例代码使用 SQLServerStatement 类的 setResponseBuffering 方法将响应缓冲模式设置为“adaptive”,并演示如何获取自适应缓冲模式

然后,它运行 SQL 语句,并将返回的数据放入可更新的 SQLServerResultSet 对象中。

最后,示例代码将循环访问结果集中的数据行。 如果找到空的文档摘要,将结合使用 updateStringupdateRow 方法来更新数据行,并再次将它保存到数据库中。 如果已有数据,将使用 getString 方法来显示部分数据。

驱动程序的默认行为是“adaptive”。但是,对于只进的可更新结果集,以及当结果集中的数据大于应用程序内存时,应用程序必须使用 SQLServerStatement 类的 setResponseBuffering 方法显式设置自适应缓冲模式。

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

另请参阅

处理大型数据