Mar 31, 2016

JAVA - problemas con "the statement did not return a result set" al ejecutar querys con multiples sentencias en sqlserver




Si durante una ejecución de consultas en java (contra ambientes SQLServer) se han encontrado con el error:
 "the statement did not return a result set"

Eso se debe a que durante la ejecución del comando siguiente (ver comando a continuación)
ResultSet rs=stmt.executeQuery(query)

la variable query posee variadas sentencias antes de devolver el select final. Por ejemplo mi caso se trataba de que antes de hacer el select final, anterior a eso ejecutaba consultas que llenaban tablas temporales. Por ende al momento de ejecutar todo ese código completo el JDBC no era capaz de omitir las consultas anteriores a mi select final.

Para solucionar aquello se puede ocupar dos opciones:

1.- Añadir al comienzo de mi conjunto de consultas (variable query) la cláusula set nocount on
Asi omitiremos la información de las filas afectadas con mis consultas que llenaban las tablas temporales.

2.- Esta opción es la que más me gustó y consiste en utilizar otro driver JDBC que no dá estos problemas. Así que reemplazé mi driver JDBC con JTDS
(http://sourceforge.net/projects/jtds/ )

Desde mi punto de vista esta opción es muy buena, dicho driver ofrece una gama más amplia de conexión entre las distintas versiones de sqlserver y también para sybase. (ojo que la versión 1.3.* de dicho driver funciona sólo con versión de java 1.7 o superior sino al momento de compilar obtendrán el error: JVMCFRE003 bad major version; class=net/sourceforge/jtds/jdbc/Driver, offset=6)

Si comienzan a usar dicho driver tendrán que editar el método a invocación de la clase:

        Connection conn = null;
        ResultSet rs = null;
        String url = "jdbc:jtds:sqlserver://server;instance=MSSQL;DatabaseName=master";
        String driver = "net.sourceforge.jtds.jdbc.Driver";
        String userName = "sa";
        String password = "password";
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, userName, password);
 
Luego de esto  al obtener el result set asociado ya no tendrán ningún otro inconveniente:
ResultSet rs=stmt.executeQuery(query)
 
Espero les haya sido útil la información. 

No comments:

Post a Comment