Conectar a SQL Server 2012 desde APP Android.

Hola a Tod@s.

El otro día haciendo una app para un cliente tube un problema con una conexión a SQL Server 2012 y ahora os quiero mostrar los pasos seguidos para que no tengáis el mismo problema que yo.

Primero y el mas importante de todos es habilitar el protocolo TCP/IP de la configuración de Red del servicio de nuestra Instancia de sql server.

SQL_Manager_1

Segundo, crearemos una excepción en el firewall para la aplicación de SQL Server.

Tercero, pondremos la autenticación de nuestro servidor en modo mixto, para ello pulsaremos botón derecho sobre el servidor en cuestión y propiedades. Dentro del submenú de seguridad elegiremos el Modo de Autenticación de Windows y SQL Server


SQL_Manager_2

Cuarto crearemos la clase ConexionBD con todo lo necesario para hacer una conexión y ejecutar una sentencia o recuperar un cursor.

package com.encuestas.util;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import com.encuestas.FullscreenActivity;

public class ConexionBD {
private static java.sql.Connection connection = null;
private final static String url = "jdbc:jtds:sqlserver://";
        private final static String databaseName = "dbName";  //Nombre de Nuestra BBDD
        private final static String userName = "sa";                   //Nombre del usuario 
        private final static String password = "1234/";              //Contraseña del usuario
        boolean intentoPWD = false;        //Se utiliza para saber si ha intentado conectar con la contraseña habitual, si es true es que no ha podido conectar con la habitual y lo intentará otra vez con la otra. Mi servidor tiene dos posibles contraseñas para según que clientes. Este booleano lo podéis quitar.

    public ConexionBD(){}

public boolean ExecSQL(String stsql) {
try {
connection = this.getConnection();
if (connection != null) {
Statement select = connection.createStatement();
select.executeQuery(stsql);
                 select.close();   
                 closeConnection();  
                 return true;
}
else
return false;
} catch (Exception e) {
System.out.println("Error en EjecutaConsulta: " + e.toString());
return false;
}  
}
//No se devuelve el ResulSet porque en que se cierra la conexión el select o el resulset ya no se puede utilizar.
public Object[][] ExecSQLRS(String stsql) {
ResultSet result = null;
try {
connection = this.getConnection();
if (connection != null) {
Statement select = connection.createStatement();
                result = select.executeQuery(stsql);   
                
                ResultSetMetaData rsMetaData = result.getMetaData();
                int columnCount = rsMetaData.getColumnCount();
                ArrayList result2 = new ArrayList();
                Object[] header = new Object[columnCount];
                
                for (int i=1; i <= columnCount; ++i){
                    Object label = rsMetaData.getColumnLabel(i);
                    header[i-1] = label;
                }
                
                while (result.next()){
                    Object[] str = new Object[columnCount];
                    for (int i=1; i <= columnCount; ++i){
                        Object obj = result.getObject(i);
                        str[i-1] = obj;
                    }
                    result2.add(str);
                }
                
                int resultLength = result2.size();
                Object[][] finalResult = new Object[resultLength+1][columnCount];
                finalResult[0] = header;
                
                int posRes = 1; 
                for(int i=0;i
                    Object[] row = result2.get(i);
                    finalResult[posRes] = row;
                    posRes++;
                }                
                
                select.close();
                result.close();                 
                return finalResult;
}
else
return null;
} catch (Exception e) {
System.out.println("Error en EjecutaConsulta: " + e.toString());
return null;
}  
}
//FullscreenActivity.ip_servidor es un valor guardado en el movil por pantalla de configuración, pero vosotros podéis ponerlo a pelo
public static String getConnectionUrl() {
return url + FullscreenActivity.ip_servidor + "/" + databaseName + ";";
    }
private java.sql.Connection getConnection() {
 
         try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            if(intentoPWD == false)
            connection = java.sql.DriverManager.getConnection(getConnectionUrl(), userName, password);
            else
            connection = java.sql.DriverManager.getConnection(getConnectionUrl(), userName, password + "provis");

            if (connection != null)
            System.out.println("Connection Successful!");
            
         } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error Trace in getConnection() : " + e.getMessage());
            if(intentoPWD == false)
            {
            intentoPWD = true;
            getConnection();            
            }
         }
         return connection;
    }

private void closeConnection() {
         try {
            if (connection != null) 
                connection.close();
            
            connection = null;
            
         } catch (Exception e) {
            e.printStackTrace();
         }
    }
}

Quinto, para usar la clase y ejecutar cualquier consulta. Definimos un objeto de la clase ConexionBD.

ConexionBD myConexionBD = new ConexionBD();

//Recuperamos un cursor con los registros de una tabla.
Object[][] pregunta = myConexionBD.ExecSQLRS("select idvarios,nombre from dbo.varios where activo = 1;");

//Ejecutamos una sentencia sql
myConexionBD.ExecSQL("insert into dbo.EncuestasRespuestas (IdVarios,IdSubvarios) VALUES " + "(" + idEncuesta + "," + idRespuesta + ")");

Comentarios

Publicar un comentario

Entradas populares