Freigeben über


Beispiel zum Verwenden der adaptiven Pufferung mit gespeicherten Prozeduren

In dieser Microsoft SQL Server 2005 JDBC Driver-Beispielanwendung wird das Abrufen eines großen OUT-Parameters aus einer gespeicherten Prozedur mit adaptiver Pufferung veranschaulicht.

Die Codedatei für dieses Beispiel heißt executeStoredProcedure.java und befindet sich im folgenden Pfad:

<Installationsverzeichnis>\sqljdbc_<Version>\<Sprache>\help\samples\adaptive

Anforderungen

Wenn Sie diese Beispielanwendung ausführen möchten, müssen Sie die Datei sqljdbc.jar in den Klassenpfad aufnehmen. Wenn im Klassenpfad kein Eintrag für "sqljdbc.jar" vorhanden ist, löst die Beispielanwendung die allgemeine Ausnahme "Klasse nicht gefunden" aus. Sie benötigen darüber hinaus Zugriff auf die SQL Server 2005 AdventureWorks-Beispieldatenbank.

Weitere Informationen zum Festlegen des Klassenpfads finden Sie unter Verwenden des JDBC-Treibers.

Außerdem müssen Sie die folgende Prozedur in der SQL Server 2005 AdventureWorks-Beispieldatenbank erstellen:

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

Beispiel

Der folgende Beispielcode stellt eine Verbindung zur SQL Server 2005 AdventureWorks-Datenbank her. Im Beispielcode werden anschließend Beispieldaten erstellt, und die Tabelle Production.Document wird mithilfe einer parametrisierten Abfrage aktualisiert. Dann legt der Beispielcode den Modus für die adaptive Pufferung mithilfe der setResponseBuffering-Methode der SQLServerStatement-Klasse fest und führt die gespeicherte Prozedur GetLargeDataValue aus.

Schließlich zeigt der Beispielcode die mit den OUT-Parametern zurückgegebenen Daten an. Darüber hinaus wird die Verwendung der mark-Methode und der reset-Methode im Stream zum erneuten Lesen eines beliebigen Teils der Daten veranschaulicht.

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

             SQLServerCallableStatement SQLcstmt = (SQLServerCallableStatement) cstmt;
             
             // If you have not already set the responseBuffering=adaptive in the 
             // connection properties, you can set the response buffering to adaptive 
             // on the statement level before executing the query, such as:    
             SQLcstmt.setResponseBuffering("adaptive");

             // Display the response buffering mode.
             System.out.println("Response buffering mode has been set to " +
                   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) {}
        }
    }
}

Siehe auch

Andere Ressourcen

Arbeiten mit adaptiver Pufferung