使用存储过程读取大型数据的示例

此 Microsoft JDBC Driver for SQL Server 示例应用程序演示如何从存储过程中检索大型 OUT 参数。

此示例的代码文件命名为 executeStoredProcedure.java，可以在以下位置找到：

<安装目录>\sqljdbc_<版本>\<语言>\help\samples\adaptive

# 要求

要运行此示例应用程序，需要访问 SQL Server 2005 AdventureWorks 示例数据库。还必须将 classpath 设置为包含 sqljdbc.jar 文件或 sqljdbc4.jar 文件。如果 classpath 缺少 sqljdbc.jar 项或 sqljdbc4.jar 项，示例应用程序将引发“找不到类”的常见异常。有关如何设置 classpath 的详细信息，请参阅使用 JDBC Driver。

Microsoft JDBC Driver for SQL Server 提供两个类库文件：sqljdbc.jar 和 sqljdbc4.jar，具体使用哪个文件取决于首选的 Java 运行时环境 (JRE) 设置。有关选择哪个 JAR 文件的详细信息，请参阅 JDBC Driver 的系统要求。

还必须在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程：

    CREATE PROCEDURE GetLargeDataValue
      (@Document_ID int,
       @Document_ID_out int OUTPUT,
       @Document_Title varchar(50) OUTPUT,
       @Document_Summary nvarchar(max) OUTPUT)

    AS
    BEGIN
       SELECT @Document_ID_out = DocumentID,
              @Document_Title = Title,
              @Document_Summary = DocumentSummary
        FROM  Production.Document
        WHERE DocumentID = @Document_ID
    END

# 示例

在下面的示例中，示例代码建立到 SQL Server 2005 AdventureWorks 数据库的连接。接下来，示例代码创建示例数据并使用参数化查询更新 Production.Document 表。然后，示例代码通过使用 SQLServerStatement 类的 getResponseBuffering 方法获取自适应缓冲模式，并执行 GetLargeDataValue 存储过程。请注意，从 JDBC Driver 2.0 发行版开始，responseBuffering 连接属性默认情况下设置为“adaptive”。

最后，示例代码显示使用 OUT 参数返回的数据，同时还演示如何在流中使用 mark 和 reset 方法以重新读取数据的任何部分。

    import java.sql.*;
    import java.io.*;
    import com.microsoft.sqlserver.jdbc.SQLServerCallableStatement;

    public class executeStoredProcedure {

        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;

            try {
              // Establish the connection.
              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
              con = DriverManager.getConnection(connectionUrl);

              // Create test data as an example.
              StringBuffer buffer = new StringBuffer(4000);
              for (int i = 0; i < 4000; i++)
                 buffer.append( (char) ('A'));

              PreparedStatement pstmt = con.prepareStatement(
                   "UPDATE Production.Document " +
                   "SET DocumentSummary = ? WHERE (DocumentID = 1)");

              pstmt.setString(1, buffer.toString());
              pstmt.executeUpdate();
              pstmt.close();

              // Query test data by using a stored procedure.
              CallableStatement cstmt =
                 con.prepareCall("{call dbo.GetLargeDataValue(?, ?, ?, ?)}");

              cstmt.setInt(1, 1);
              cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
              cstmt.registerOutParameter(3, java.sql.Types.CHAR);
              cstmt.registerOutParameter(4, java.sql.Types.LONGVARCHAR);

              // Display the response buffering mode.
              SQLServerCallableStatement SQLcstmt = (SQLServerCallableStatement) cstmt;
              System.out.println("Response buffering mode is: " +
                   SQLcstmt.getResponseBuffering());

              SQLcstmt.execute();
              System.out.println("DocumentID: " + cstmt.getInt(2));
              System.out.println("Document_Title: " + cstmt.getString(3));

              Reader reader = SQLcstmt.getCharacterStream(4);

              // If your application needs to re-read any portion of the value,
              // it must call the mark method on the InputStream or Reader to
              // start buffering data that is to be re-read after a subsequent
              // call to the reset method.
              reader.mark(4000);

              // Read the first half of data.
              char output1[] = new char[2000];
              reader.read(output1);
              String stringOutput1 = new String(output1);

              // Reset the stream.
              reader.reset();

              // Read all the data.
              char output2[] = new char[4000];
              reader.read(output2);
              String stringOutput2 = new String(output2);

              // Close the stream.
              reader.close();
          }
          // Handle any errors that may have occurred.
          catch (Exception e) {
              e.printStackTrace();
          }
          finally {
              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) {}
          }
       }
    }

# 请参阅

处理大型数据
发送有关本主题的反馈至 Microsoft。

© 2012 Microsoft。保留所有权利。