Cuando se usa el Controlador Microsoft JDBC para SQL Server, puede que tenga que controlar instrucciones complejas, incluidas instrucciones generadas dinámicamente en tiempo de ejecución. Las instrucciones complejas suelen realizar tareas diversas como actualizaciones, inserciones y eliminaciones. Estos tipos de instrucciones pueden devolver varios conjuntos de resultados y parámetros de salida. En estos casos, el código Java que ejecuta las instrucciones puede no saber por anticipado los tipos y el número de objetos y datos devueltos.

Para procesar las instrucciones complejas del modo adecuado, el controlador JDBC proporciona una serie de métodos para consultar los objetos y datos devueltos para que la aplicación pueda procesarlos correctamente. La clave para procesar las instrucciones complejas es el método execute de la clase SQLServerStatement. Este método devuelve un valor boolean. Si el valor es true, el primer resultado devuelto de las instrucciones es un conjunto de resultados. Si el valor es false, el primer resultado devuelto es un recuento de actualizaciones.

Cuando sepa el tipo de objeto o datos devueltos, puede usar el método getResultSet o getUpdateCount para procesar los datos. Para continuar con el objeto o datos siguientes devueltos desde la instrucción compleja, puede llamar al método getMoreResults.

En el siguiente ejemplo, se pasa una conexión abierta con la base de datos de ejemplo AdventureWorks de SQL Server 2005 a la función, se genera una instrucción compleja que combina una llamada al procedimiento almacenado con una instrucción SQL, se ejecutan las instrucciones y, a continuación, se usa un bucle do para procesar todos los conjuntos de resultados y recuentos de actualizaciones devueltos.

public static void executeComplexStatement(Connection con) {
   try {
      String sqlStringWithUnknownResults = "{call dbo.uspGetEmployeeManagers(50)};SELECT TOP 10 * FROM Person.Contact";
      Statement stmt = con.createStatement();
      boolean results = stmt.execute(sqlStringWithUnknownResults);
      int count = 0;
      do {
         if (results) {
            ResultSet rs = stmt.getResultSet();
            System.out.println("Result set data displayed here.");
            rs.close();
         } else {
            count = stmt.getUpdateCount();
            if (count >= 0) {
               System.out.println("DDL or update data displayed here.");
            } else {
               System.out.println("No more results to process.");
            }
         }
         results = stmt.getMoreResults();
      } while (results || count != -1);
      stmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}

Vea también