En esta aplicación de ejemplo del Controlador Microsoft JDBC para SQL Server se muestra cómo recuperar un parámetro OUT grande desde un procedimiento almacenado.
El archivo de código para este ejemplo se denomina executeStoredProcedure.java y se encuentra en la siguiente ubicación:
<directorio de instalación>\sqljdbc_<versión>\<idioma>\help\samples\adaptive
Requisitos
Para ejecutar esta aplicación de ejemplo, deberá tener acceso a la base de datos de ejemplo SQL Server 2005 AdventureWorks. También deberá establecer la ruta de clase para incluir el archivo sqljdbc.jar o el archivo sqljdbc4.jar. Si en la ruta de clase falta una entrada para sqljdbc.jar o sqljdbc4.jar, la aplicación de ejemplo produce la excepción común "Clase no encontrada". Para obtener más información acerca de cómo establecer la ruta de clase (classpath), vea Usar el controlador JDBC.
El Controlador Microsoft JDBC para SQL Server proporciona los archivos de biblioteca de clases sqljdbc.jar y sqljdbc4.jar que hay que usar dependiendo de su configuración preferida de Java Runtime Environment (JRE). Para obtener más información acerca del archivo JAR que hay que elegir, vea Requisitos del sistema para el controlador JDBC.
También debe crear el procedimiento almacenado siguiente en la base de datos de ejemplo SQL Server 2005AdventureWorks:
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
Ejemplo
En el siguiente ejemplo, el código muestra realiza una conexión a la base de datos SQL Server 2005 AdventureWorks. Luego, el código muestra crea los datos del ejemplo y actualiza la tabla Production.Document con una consulta con parámetros. A continuación, el código muestra establece el modo de almacenamiento en búfer adaptable con el método getResponseBuffering de la clase SQLServerStatement y ejecuta el procedimiento almacenado GetLargeDataValue. Tenga en cuenta que desde la publicación de la versión 2.0 del controlador JDBC, la propiedad de conexión responseBuffering se establece en "adaptive" de manera predeterminada.
Finalmente, el código muestra los datos devueltos con los parámetros OUT y cómo utilizar los métodos mark y reset en el flujo para volver a leer cualquier parte de los datos.
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) {} } } }