Esempio di lettura di dati di grandi dimensioni con una stored procedure
In questa applicazione di esempio del driver JDBC per Microsoft SQL Server viene illustrato come recuperare un parametro OUT di grandi dimensioni da un stored procedure.
Il file di codice per questo esempio è denominato executeStoredProcedure.java ed è disponibile nel seguente percorso:
<directory di installazione>\sqljdbc_<versione>\<lingua>\help\samples\adaptive
Requisiti
Per eseguire questa applicazione di esempio, sarà necessario accedere al database di esempio SQL Server 2005 AdventureWorks, nonché impostare il classpath per includere il file sqljdbc.jar o sqljdbc4.jar. Se nel classpath manca una voce per il file sqljdbc.jar o sqljdbc4.jar, nell'applicazione di esempio verrà generata un'eccezione comune di classe non trovata. Per ulteriori informazioni sull'impostazione del classpath, vedere Utilizzo del driver JDBC.
Nota
Con il driver JDBC versione 2.0 per Microsoft SQL Server vengono forniti i file di libreria di classi sqljdbc.jar e sqljdbc4.jar, da utilizzare a seconda delle impostazioni preferite di Java Runtime Environment (JRE). Per ulteriori informazioni sul file JAR da scegliere, vedere Requisiti di sistema per il driver JDBC.
È inoltre necessario creare la stored procedure seguente nel database di esempio AdventureWorks di SQL Server 2005:
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
Esempio
Nell'esempio seguente mediante il codice di esempio viene eseguita una connessione al database AdventureWorks di SQL Server 2005. Tramite il codice di esempio vengono quindi creati i dati di esempio e viene aggiornata la tabella Production.Document utilizzando una query con parametri. Viene quindi ottenuta la modalità di buffer adattivo utilizzando il metodo getResponseBuffering della classe SQLServerStatement e viene eseguita la stored procedure GetLargeDataValue. A partire dal driver JDBC versione 2.0, il valore predefinito della proprietà di connessione responseBuffering è "adaptive".
Infine, tramite il codice di esempio vengono visualizzati i dati restituiti con i parametri OUT e viene illustrato come utilizzare i metodi mark
e reset
sul flusso per rileggere qualsiasi parte dei dati.
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) {}
}
}
}