Buscar (Don't Edit)

miércoles, 9 de octubre de 2013

Hazlo fácil: Conectar aplicación Android a Base de Datos SQLServer

Quizás debería estar durmiendo a estas horas de la madrugada, o quizás viendo una película o pasando el rato navegando..., quizás, pero no, en lugar de eso estoy aquí picando algo de código y me pasó por la mente "Hey, si de escribir código se trata, porque no hacerlo para un tutorial, al fin y al cabo le debes un tiempo al blog", y me respondí "Cierto, pero antes de pasar a cosas interesantes, empecemos con algo sencillo que nos servirá para calentar motores", así que adelante... (la falta de sueño causa más daño de lo que creí)

Con este tutorial lograrán conectar cualquier aplicación android con una base de datos SQL Server tanto local como remotamente de una manera sencilla, tal y como si se tratara de una aplicación java común y corriente, y esto gracias al driver jTDS de JDBC.


Descargar el driver jTDS
Entonces lo primero que haremos será ir  a la página oficial y descargarnos el driver. NOTA: El driver que utilizaré será el 1.2.7 y android 4.2.

Creando el proyecto y añadiendo el driver
Una vez descargado, abrimos nuestro IDE(en mi caso eclipse) y creamos una nueva aplicación de android.

Una vez creado importaremos el jar del driver jTDS a nuestro proyecto, para esto hacemos click derecho sobre nuestro proyecto->Properties->Java Build Path->Libraries y en Add External JARs..., buscamos nuestro jar descargado y click en OK.


La clase DBConnection
Creamos una nueva clase que llamaremos DBConnection y la crearé como un Singleton,
Añadimos los atributos URL, USER y PASS que contendrán la información y credenciales para conectarnos a la base de datos.
Ya saben lo que pienso sobre el código duro pero dado que es un ejemplo, podemos dejarlo pasar.

Después creamos el método que hará la conexión, y en el instanciamos el driver para después pasarle nuestros datos de conexión al DriverManager.
Bueno, ya para terminar creare otro método singleton que obtendrá la conexión hecha en nuestro método conectar().

Entonces la clase final nos quedaría de la siguiente manera:


Llamando a nuestra conexión
Ahora para llamar llamar a nuestra clase lo haremos de la manera como se llaman a las clases Singleton.



Otorgando permisos a nuestra aplicación
Por poco lo olvido, necesitarán otorgarle permisos a su aplicación para que pueda hacer uso del internet y conectarse a su base de datos si ésta se encuentra remota. En el AndroidManifest.xml de su aplicación añadan la siguiente línea de código.

Ok, ahora si es todo. Espero les sea útil, hasta la próxima! ;)

71 comentarios:

  1. man que tal?? en la linea numero 5 me sale el siguiente error, el mensaje lo dejo mas abajo..hice todo como dice el tutorial pero no sale, me podes indicar cual seria el posible problema??
    1 private Connection conectar()
    2 {
    3 Connection conn= null;
    4 try{
    5 (new Driver()).getClass();
    6 conn=DriverManager.getConnection(URl,USER,PASS);
    7 }catch(SQLException e){
    8 e.printStackTrace();
    9 }
    10 return conn;
    11 }
    Mensaje: Cannot instantiate the type Driver

    ResponderBorrar
    Respuestas
    1. Coloca el siguiente IMPORT en la parte superior de tu programa:

      import net.sourceforge.jtds.jdbc.Driver;

      Con esto hacemos referencia a la clase Driver de jTDS.

      Saludos ;)

      Borrar
  2. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
    Respuestas
    1. buenos días, disculpe las molestias solo una duda...de casualidad podría recomendarme algunos temas para poder hacer una aplicación similar a "mercado libre" es para un proyecto de la escuela pero no casi nada de conocimientos sobre android...de antemano gracias :D

      Borrar
    2. Pues de entrada te recomendaría reforzar el conocimiento sobre la plataforma, posteriormente meterte en temas de Selling In-App Products, puedes leer sobre el tema aquí http://developer.android.com/training/in-app-billing/index.html
      Saludos.

      Borrar
    3. ok :D muchas gracias, saludos

      Borrar
  3. disculpa una pregunta he echo todo lo que esta aqui pero a la hora de probar la aplicacion nunca conecta siempre me falla... intento hace simplemente esto pero no funciona siempre sale fallo
    Connection conexion = Conexion.getInstance().getConnection();

    if(conexion == null)
    Toast.makeText(this, "fallo", Toast.LENGTH_SHORT).show();
    else
    Toast.makeText(this, "entro", Toast.LENGTH_SHORT).show();

    ResponderBorrar
    Respuestas
    1. Revisa el LogCat a ver que es lo que te arroja, fijate que yo utilizo datos de prueba:
      donde pongo SERVER debiera ir la dirección de tu servidor (localhost o la IP), el nombre de la base de datos en DATABASE y unas credenciales validas en USERNAME y PASSWORD

      Borrar
  4. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  5. ya coloque la direccion como debe ir ya que instale una app que hace la conexion con esa base de datos y entra normal, al colocar los mismos parametros en mi aplicacion no me funciona.

    puse el import que señalas arriba y me sale el siguiente error en esta linea

    (new Driver()).getClass();

    =/

    ResponderBorrar
    Respuestas
    1. Revisa si otorgaste los permisos a la aplicación para que pueda conectarse a internet? Está en el último párrafo

      Borrar
    2. si ya le otorgue los permisos... pero me dice que no encuentra el driver java.lang.NoClassDefFoundError:net.source.jtds.jdbc.Driver

      Borrar
    3. conseguí el error... se debe agregar al path la ubicación del .jar luego para las versiones 3.0 o superior se debe usar los métodos asíncronos ya que android no lo permite hacer para evitar el cierre de las aplicaciones y por ultimo use la versión 1.2.7 del jtds ya que la 1.3.1 no me funciono.

      Borrar
    4. hola cómo agrego al path la ubicación del .jar ???

      Salu2

      Borrar
  6. Buenas!!
    Moises que es eso de usar los métodos asíncronos?? Tengo el mismo problema que tu y no se que hacer ya para solucionarlo. Un saludo.

    ResponderBorrar
    Respuestas
    1. Puedes leer sobre el tema en el siguiente link http://moztrodev.blogspot.mx/2013/10/android-conexion-jtds-de-manera.html

      Borrar
  7. Buen dia

    Necesito de una gran ayuda

    Tengo un formulario el cual quiero que los parametros finales como Nombre, edad, correo electronico, se envien a una base de datos de mysql de manera remota...Podrian ayudarme??

    ResponderBorrar
  8. Amigo quiero hacer lo mismo pero con mysql y un servidor local, el tema es que no se que ip debo colocarle para el server si me puedes ayudar muchas gracias

    ResponderBorrar
    Respuestas
    1. Lamentablemente el driver de JTDS solo funciona con bases de datos SQL Server y Sybase.

      Borrar
    2. Y si utilizo Postgres? la verdad que eso de base de datos siempre me trajo problemas, ayudame con algunos tips sobre como montar esa movida en el servidor,,,

      Borrar
  9. Tengo algunas dudas, corrigeme si me equivoco pero yo lo intenté de la siguiente manera: donde dice server pongo mi ip, donde dice database pongo el nombre de mi base de datos y en username puse mi nombre de usuario, no se si el problema es que en mi SQL Server yo entro con autenticacion de windows y por eso no puedo entrar.

    ResponderBorrar
  10. Y como seria si utilizo el Android studio para conectar con SQL server

    ResponderBorrar
  11. Muy bueno muchas gracias me saco de apuros

    ResponderBorrar
  12. realice la conexión , y en mi aplicación hago un select , que me retorna la existencia de un articulo. al presionar el botón buscarexistencia por primera vez me lo muestra fantástico,pero si le doy la segunda me envía una excepción fatal en AsyncTask #2. ayuda

    ResponderBorrar
    Respuestas
    1. Podrías pegar el stacktrace de la excepción, sin él es imposible saber cuál es el problema

      Borrar
    2. disculpa por contestar debajo aqui pongo lo que me genera el logcat

      05-16 17:21:21.160: E/AndroidRuntime(1695): FATAL EXCEPTION: AsyncTask #1
      05-16 17:21:21.160: E/AndroidRuntime(1695): Process: es.epinanab.Hello, PID: 1695
      05-16 17:21:21.160: E/AndroidRuntime(1695): java.lang.RuntimeException: An error occured while executing doInBackground()
      05-16 17:21:21.160: E/AndroidRuntime(1695): at android.os.AsyncTask$3.done(AsyncTask.java:300)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.lang.Thread.run(Thread.java:841)
      05-16 17:21:21.160: E/AndroidRuntime(1695): Caused by: java.lang.NullPointerException
      05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura.displayDbProperties(Captura.java:141)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura$GetDBconnection.doInBackground(Captura.java:85)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura$GetDBconnection.doInBackground(Captura.java:1)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at android.os.AsyncTask$2.call(AsyncTask.java:288)
      05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
      05-16 17:21:21.160: E/AndroidRuntime(1695): ... 3 more
      05-16 17:26:21.380: I/Process(1695): Sending signal. PID: 1695 SIG: 9
      05-16 17:26:25.550: I/Choreographer(1729): Skipped 41 frames! The application may be doing too much work on its main thread.

      att: Alejandro

      Borrar
    3. hola me podrias mostrar como conectaste a tu base de datos xfa , no me sale la conexion, gracias

      Borrar
  13. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  14. Hola daniel, gracias por tu pronta respuesta te envio parte del codigo con el que me conecto es practicamente todo lo que tu has hecho. voy a copiarte tambien el error que me da.

    public class GetDBconnection extends AsyncTask {
    WeakReference context;

    public GetDBconnection(Captura activity) {
    context = new WeakReference(activity);

    }
    @Override
    protected String doInBackground(String... params)
    {
    try
    {
    return displayDbProperties(params[0]);
    }
    catch(NullPointerException ews)
    {
    System.out.println("error a ejecutar el doInBackground..."+ews.toString());
    }


    return "";

    }
    @Override
    protected void onProgressUpdate(Integer... values) {


    }

    @Override
    protected void onPreExecute()
    {


    }

    protected void onPostExecute(String c)
    {

    EditText txtSaludo = (EditText) findViewById(R.id.editnombre);
    txtSaludo.setText(c);

    }


    }

    static public String displayDbProperties(String articulo)
    {
    JtdsDatabaseMetaData dm = null;
    ResultSet result = null;
    String cantidad="";
    connection=null;


    try {

    connection = DBConexion.getInstance().getConnection();

    if (connection != null) {

    try
    {
    JtdsStatement select = (JtdsStatement) connection.createStatement();
    result = select.executeQuery("select CANT_DISP_RESERV from pi.BOLETA_INV_FISICO where ARTICULO='"+articulo+"'");
    }
    catch(SQLException e)
    {
    System.out.println("error al ejecutar sentencia..."+e.toString());
    closeConnection();
    }
    while (result.next())
    {

    cantidad=result.getString(1);

    }

    result.close();
    result = null;
    closeConnection();

    }
    else
    System.out.println("Error: No active Connection");
    }
    catch (SQLException e)
    {

    System.out.println("error con coneccion"+e.toString());

    }
    dm = null;
    return cantidad;
    }

    ResponderBorrar
  15. me dice que fue causada por un NullPointerException . por cierto mi nombre es Alejandro y estoy comenzando en android

    ResponderBorrar
    Respuestas
    1. Que tal Alejandro, sería genial que colocaras el Stacktrace de la excepción, para saber en qué parte exactamente ocurre el NullPointerException, saludos

      Borrar
  16. bueno aqui te pongo lo que me da el logcat no se si es eso lo que me pides, gracias de antemano
    05-16 17:21:21.160: E/AndroidRuntime(1695): FATAL EXCEPTION: AsyncTask #1
    05-16 17:21:21.160: E/AndroidRuntime(1695): Process: es.epinanab.Hello, PID: 1695
    05-16 17:21:21.160: E/AndroidRuntime(1695): java.lang.RuntimeException: An error occured while executing doInBackground()
    05-16 17:21:21.160: E/AndroidRuntime(1695): at android.os.AsyncTask$3.done(AsyncTask.java:300)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.lang.Thread.run(Thread.java:841)
    05-16 17:21:21.160: E/AndroidRuntime(1695): Caused by: java.lang.NullPointerException
    05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura.displayDbProperties(Captura.java:141)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura$GetDBconnection.doInBackground(Captura.java:85)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at es.epinanab.Hello.Captura$GetDBconnection.doInBackground(Captura.java:1)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at android.os.AsyncTask$2.call(AsyncTask.java:288)
    05-16 17:21:21.160: E/AndroidRuntime(1695): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    05-16 17:21:21.160: E/AndroidRuntime(1695): ... 3 more
    05-16 17:26:21.380: I/Process(1695): Sending signal. PID: 1695 SIG: 9
    05-16 17:26:25.550: I/Choreographer(1729): Skipped 41 frames! The application may be doing too much work on its main thread.

    ResponderBorrar
    Respuestas
    1. OK, muchas gracias, también te recomendaría ir debuggeando para tener una idea más clara de lo que está ocurriendo

      Borrar
    2. Por cierto, para que te sirve tu clase JtdsDatabaseMetaData? veo que tienes un referencia nula a ella y nunca la utiizas, salvo al final cuando la vuelves a igualar a null.

      Borrar
    3. no sirve para nada.. solo la deje ahi, pero no hace nada. sera el problema con la conexion porque la primer vez se conecta y aparentemente la segunda vez falla la conexion.

      Borrar
    4. 05-16 18:07:05.070: I/System.out(1929): Connection Successful! esto es lo que me manda la primer vez

      05-16 18:07:20.150: I/System.out(1929): error con coneccionjava.sql.SQLException: Invalid state, the Connection object is closed. y esto es lo que me envia la segunda vez

      Borrar
  17. gracias Daniel , ya lo resolví con tu ayuda en un blog tuyo http://moztrodev.blogspot.com/2013/10/android-conexion-jtds-de-manera.html. sos grandioso muchas gracias. solo que a un no me queda claro porque de la forma que lo queria hacer daba ese error. una vez mas gracias. espero ver mas aportes tuyos. maestro :)

    ResponderBorrar
    Respuestas
    1. Felicidades y con los mensajes q pusiste ya pude ver lo que ocurre. Lo que sucedia es que cerrabas la conexion la primera vez y por eso las veces consecutivas ya no podias hacer uso de ella. Lo que pasa que la clase singleton es la que se encarga de manejar las conexiones y por ello no habia necesidad de cerrarla manualmente. Saludos

      Borrar
    2. Felicidades y con los mensajes q pusiste ya pude ver lo que ocurre. Lo que sucedia es que cerrabas la conexion la primera vez y por eso las veces consecutivas ya no podias hacer uso de ella. Lo que pasa que la clase singleton es la que se encarga de manejar las conexiones y por ello no habia necesidad de cerrarla manualmente. Saludos

      Borrar
    3. hola daniel soy alejandro , bueno estoy estudiando android y pues me gustaría saber que ventajas tengo de hacer la conexion de esta manera y no por un web service. podrias aclararme esta duda porfa

      Borrar
    4. Que tal alejandro, definitivamente la opción correcta es hacerlo a través de un web service. La razón por la que lo hice de ésta manera es porque me tocó realizar una app para una empresa donde los usuarios solamente podían hacer uso de ella dentro de la red empresarial y acceder a la base de datos, fue parte de las reglas de negocio. Pero eso fue en el caso particular de esta app y por petición de la empresa, y la razón por la que lo publique fue porque el driver jtds se me hizo una herramienta muy interesante y sencilla de usar, pero sin lugar a dudas la mejor manera y por buena práctica es hacer que nuestras apps consuman web services para realizar este tipo de tareas. Y me acabo de dar cuenta que aún no tenemos un post al respecto, pero no te preocupes que prepararemos uno proximamente.

      Saludos

      Borrar
    5. ok daniel gracias por tu respuesta ,espero con ansias ese post

      Borrar
    6. es mejor realizar una coneccion directa al servidor o utilizar los web services ?

      Borrar
  18. hola daniel , soy alejandro, como te dije estoy estudiando android y ahora quiero hacer una tabla que me muestre los datos de mi ResultSet, pero con lo que he investigado se me hace muy difícil hacerlo , he investigado acerca de tablelayout, pero me di cuenta que es un rollo hacerla . yo se que este post no se trata de este tema pero agradecería cualquier consejo que me puedas dar en este aspecto para hacerla de un forma mas fácil , si esta a tu alcance hermano
    de antemano gracias.
    saludos,

    ResponderBorrar
  19. Como tiene que estar programado el servidor (la pagina) para imprimir los datos enviados?

    ResponderBorrar
  20. Buenas noche Dany, primero muchas gracias por subir este tutorial, y ya lo realice perfecto solamente me marca error en:

    public class DBConnection {

    private static DBConnection instance = null;
    private static final String URL="jdbc:jtds:sqlserver://MAYA-PC/SQLMAYA/prueba";
    private static final String USER = "sa";
    private static final String PASS = "jesusemir";
    private static Connection connection = null;

    me dice que no se utiliza el valor del campo DBConnection.USER,PASS, URL.

    sabes por que me pasa esto??

    ResponderBorrar
  21. DBConnection
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import net.sourceforge.jtds.jdbc.Driver;



    public class DBConnection {
    private static DBConnection instance=null;
    private static final String URL="jdbc:jtds:sqlserver://localhost;user=sa;password=123;";
    private static final String USER="sa";
    private static final String PASS="123";

    private static Connection connection=null;




    public static DBConnection getInstance(){
    if (instance==null)
    instance= new DBConnection();
    return instance;
    }
    public Connection getConnection(){
    if(connection==null)
    connection=conectar();
    return connection;

    }

    private Connection conectar(){
    Connection conn=null;
    try{
    (new Driver()).getClass();
    conn=DriverManager.getConnection(URL,USER,PASS);
    }catch(SQLException e){

    e.printStackTrace();

    }
    return conn;
    }

    }

    ResponderBorrar
  22. SIMPLE DAO
    package com.example.database;

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    public class SimpleDAO {


    Connection conn= DBConnection.getInstance().getConnection();

    public ResultSet construirLector(String query){

    ResultSet result=null;
    try{
    Statement statement= conn.createStatement();
    result=statement.executeQuery(query);
    }catch(SQLException e){
    e.printStackTrace();
    }
    return result;

    }
    }
    Usuario Dao
    package com.example.database;

    import java.sql.ResultSet;
    import java.sql.SQLException;

    public class UsuarioDao extends SimpleDAO {

    private static UsuarioDao instance=null;

    private UsuarioDao(){}

    public static UsuarioDao getIntance(){
    if(instance==null)
    instance=new UsuarioDao();
    return instance;
    }
    public String getNombreUsuario(int id){
    String result="";
    String Query=" Select * from usuario where CODUSUARIO = " + id + " ";
    ResultSet rs=super.construirLector(Query);
    try{
    while(rs.next())
    result=rs.getString("NOMBRE");

    }catch(SQLException e){
    e.printStackTrace();

    }
    return result;
    }

    }


    ResponderBorrar
    Respuestas
    1. EL LOG
      11-03 22:40:10.475: E/Trace(1392): error opening trace file: No such file or directory (2)
      11-03 22:40:11.695: D/gralloc_goldfish(1392): Emulator without GPU emulation detected.
      11-03 22:40:12.725: D/dalvikvm(1392): GC_CONCURRENT freed 189K, 3% free 11001K/11335K, paused 74ms+75ms, total 197ms
      11-03 22:40:12.765: W/System.err(1392): java.sql.SQLException: Network error IOException: failed to connect to localhost/127.0.0.1 (port 1433): connect failed: ECONNREFUSED (Connection refused)
      11-03 22:40:12.776: W/System.err(1392): at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:421)
      11-03 22:40:12.776: W/System.err(1392): at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
      11-03 22:40:12.785: W/System.err(1392): at java.sql.DriverManager.getConnection(DriverManager.java:175)
      11-03 22:40:12.785: W/System.err(1392): at java.sql.DriverManager.getConnection(DriverManager.java:209)
      11-03 22:40:12.795: W/System.err(1392): at com.example.database.DBConnection.conectar(DBConnection.java:37)
      11-03 22:40:12.795: W/System.err(1392): at com.example.database.DBConnection.getConnection(DBConnection.java:28)
      11-03 22:40:12.795: W/System.err(1392): at com.example.database.SimpleDAO.(SimpleDAO.java:11)
      11-03 22:40:12.795: W/System.err(1392): at com.example.database.UsuarioDao.(UsuarioDao.java:10)
      11-03 22:40:12.795: W/System.err(1392): at com.example.database.UsuarioDao.getIntance(UsuarioDao.java:14)
      11-03 22:40:12.805: W/System.err(1392): at com.example.database.MainActivity$GetDBConnection.doInBackground(MainActivity.java:30)
      11-03 22:40:12.805: W/System.err(1392): at com.example.database.MainActivity$GetDBConnection.doInBackground(MainActivity.java:1)
      11-03 22:40:12.805: W/System.err(1392): at android.os.AsyncTask$2.call(AsyncTask.java:287)
      11-03 22:40:12.805: W/System.err(1392): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
      11-03 22:40:12.805: W/System.err(1392): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
      11-03 22:40:12.805: W/System.err(1392): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
      11-03 22:40:12.805: W/System.err(1392): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)

      Borrar
  23. 11-03 22:40:12.805: W/System.err(1392): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    11-03 22:40:12.805: W/System.err(1392): at java.lang.Thread.run(Thread.java:856)
    11-03 22:40:12.805: W/System.err(1392): Caused by: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 1433): connect failed: ECONNREFUSED (Connection refused)
    11-03 22:40:12.815: W/System.err(1392): at libcore.io.IoBridge.connect(IoBridge.java:114)
    11-03 22:40:12.815: W/System.err(1392): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
    11-03 22:40:12.825: W/System.err(1392): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    11-03 22:40:12.825: W/System.err(1392): at java.net.Socket.startupSocket(Socket.java:566)
    11-03 22:40:12.825: W/System.err(1392): at java.net.Socket.tryAllAddresses(Socket.java:127)
    11-03 22:40:12.825: W/System.err(1392): at java.net.Socket.(Socket.java:177)
    11-03 22:40:12.825: W/System.err(1392): at java.net.Socket.(Socket.java:149)
    11-03 22:40:12.835: W/System.err(1392): at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:249)
    11-03 22:40:12.835: W/System.err(1392): at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:322)
    11-03 22:40:12.835: W/System.err(1392): ... 17 more
    11-03 22:40:12.835: W/System.err(1392): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
    11-03 22:40:12.855: W/System.err(1392): at libcore.io.Posix.connect(Native Method)
    11-03 22:40:12.855: W/System.err(1392): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
    11-03 22:40:12.855: W/System.err(1392): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
    11-03 22:40:12.855: W/System.err(1392): at libcore.io.IoBridge.connect(IoBridge.java:112)
    11-03 22:40:12.855: W/System.err(1392): ... 25 more
    11-03 22:40:12.865: W/dalvikvm(1392): threadid=11: thread exiting with uncaught exception (group=0x2bc9a300)
    11-03 22:40:12.885: E/AndroidRuntime(1392): FATAL EXCEPTION: AsyncTask #1
    11-03 22:40:12.885: E/AndroidRuntime(1392): java.lang.RuntimeException: An error occured while executing doInBackground()
    11-03 22:40:12.885: E/AndroidRuntime(1392): at android.os.AsyncTask$3.done(AsyncTask.java:299)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.lang.Thread.run(Thread.java:856)
    11-03 22:40:12.885: E/AndroidRuntime(1392): Caused by: java.lang.NullPointerException
    11-03 22:40:12.885: E/AndroidRuntime(1392): at com.example.database.SimpleDAO.construirLector(SimpleDAO.java:17)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at com.example.database.UsuarioDao.getNombreUsuario(UsuarioDao.java:20)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at com.example.database.MainActivity$GetDBConnection.doInBackground(MainActivity.java:30)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at com.example.database.MainActivity$GetDBConnection.doInBackground(MainActivity.java:1)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at android.os.AsyncTask$2.call(AsyncTask.java:287)
    11-03 22:40:12.885: E/AndroidRuntime(1392): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    11-03 22:40:12.885: E/AndroidRuntime(1392): ... 5 more

    ResponderBorrar
  24. y para Android Studio como importo ?

    ResponderBorrar
  25. Hola como le hago para importar en Android Studio version 2015

    gracias

    ResponderBorrar
  26. Buenas, Estimado muy buen aporte para los que nos iniciamos en Android, mira copie la clase de ejmplo pero me genera un error al compilar.

    Error:(30, 28) error: cannot find symbol class conectar




    Anexo mi codigo para que veas donde estoy errado.

    la IDE marca el error aca

    public Connection getConnection(){

    if(connection==null)
    connection=new conectar(); ACA MARCA ERROR EN LA CLASE conectar()
    return connection;
    }


    package syswin.developer.applectorsql;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import net.sourceforge.jtds.jdbc.Driver;

    /**
    * Created by Developer on 22/10/2015.
    */
    public class DbConnectionSQL {
    private static DbConnectionSQL instance = null;
    private static final String URL="jdbc:jtds:sqlserver://192.168.1.105:1433;user=sa;password=1234;";
    private static final String USER="sa;";
    private static final String PASSWORD="sa;";
    private static Connection connection=null;

    private DbConnectionSQL(){}

    public static DbConnectionSQL getInstance() {

    if(instance==null)
    instance=new DbConnectionSQL();
    return instance;
    }

    public Connection getConnection(){

    if(connection==null)
    connection=new conectar();
    return connection;
    }

    private Connection conectar(){
    Connection conn = null;
    try{
    (new Driver()).getClass();
    conn = DriverManager.getConnection(URL,USER,PASSWORD);
    }catch (SQLException e) {
    e.printStackTrace();
    }
    return conn;
    }


    }


    ResponderBorrar
  27. amigo tengo problema con el (new Driver()).getClass(); me salta en rojo si pudieras ayudarme

    ResponderBorrar
  28. Hola, primero quiero felicitarte por el tutorial muy bueno y solo quiero que me saque de una duda como lo harias para conectarte a Postgresql.... utilizarias la misma clase para conectarte o es diferente gracias de ante mano por la respuesta

    ResponderBorrar
    Respuestas
    1. Para Postgres hay un driver específico, el problema en mi caso, intentando conectarme a Postgres, lo hace en mi máquina local, pero cuando lo alojo en el servidor (misma red y segmento) no me permite conectarme, y lo hace mediante Thread o hilos, quiero una clase como tal.

      Borrar
  29. Hola, muy buen tuto. Sólo tengo una duda, que diferencia tiene implementar una consulta a través de un web service? es mas seguro?

    ResponderBorrar
  30. Hola, muy buen tuto. Sólo tengo una duda, que diferencia tiene implementar una consulta a través de un web service? es mas seguro?

    ResponderBorrar
  31. hola daniel a mi me aparece este error
    [2016-01-26 20:31:24 - ddmlib] Se ha anulado una conexión establecida por el software en su equipo host.
    java.io.IOException: Se ha anulado una conexión establecida por el software en su equipo host.
    at sun.nio.ch.SocketDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(Unknown Source)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
    at sun.nio.ch.IOUtil.write(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
    at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)
    at com.android.ddmlib.Client.sendAndConsume(Client.java:675)
    at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:342)
    at com.android.ddmlib.Client.requestAllocationStatus(Client.java:521)
    at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:831)
    at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:799)
    at com.android.ddmlib.DeviceMonitor.processIncomingJdwpData(DeviceMonitor.java:759)
    at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:648)
    at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:44)
    at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:576)

    puedes ayudarme por favor, tu código lo copie tal y como lo muestras

    ResponderBorrar
  32. java.sql.SQLException: No suitable driver a que se debe?

    ResponderBorrar
    Respuestas
    1. tengo el mismo error,
      ¿lograste encontrar la solución o explicación?

      Borrar
    2. import net.sourceforge.jtds.jdbc.Driver; es agregar esto y lsito

      Borrar
  33. conn = DriverManager.getConnection(URL,USER,PASS);

    Me aparece esta linea marcada en rojo, el error que aparece es el siguiente:

    Unhandled exception:java.sql.SQL.Exception

    ResponderBorrar
  34. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  35. Hola disulpen yo tengo un problema hise una plicacion con servicio web el primer formulario es el login lo que pasa es que cuando corro mi aplicacion android en el emulador memu todo anda bien ingreso mi usuario y contraseña evalua los datos los compara con los de la base de datos y ingreso al menu principal todo bien pero cuando lo corro en el genymoto o en un celular (mediante el apk) no conecta a la base de datos me sale usuario o contraseñaa incorrecto, porfa haber si me pudieran ayudar con eso se les agradeceria mucho
    Gracias!!

    ResponderBorrar
  36. Hola, una consulta como podria hacer para que la "consulta" de la base de datos no me la de en un list view sino en un edit text o en un Text View. Gracias!!

    ResponderBorrar
  37. hola amigos les hago una consulta, tengo un servidor sql server 2008 remoto de ip dinamica. y tengo un servicio del dinamic dns de NO-IP. cuando en el string de conexion pongo el ip me funciona de diez. pero cuando pongo el nombre del servidor, que es consultorio.no-ip.org no me anda y me dice que no se ecnuentra el servidor. Podrian darme una ayuda? Saludos y gracias

    ResponderBorrar