Erro na conexão direta Android com SQLServer

Estou tentando conectar minha aplicação com o SQLServer da mesma forma que fazemos nos Desktops, através do jtds…

mas já na hora de conectar me deparo com um erro estranho…

import java.sql.*;

import android.app.Activity;
import android.util.Log;

public class SQL_Server extends Activity
{
	Gravar_Cids_TCCActivity atv = new Gravar_Cids_TCCActivity();
	
    String driver = "net.sourceforge.jtds.jdbc.Driver";
    String url = "jdbc:jtds:sqlserver://localhost:1433/BabyLar;integratedSecurity=true";

    Connection conexao;
    Statement st;
    ResultSet rs;
    
    public void conecta ()
    {
    	try
        {
            Class.forName(driver);
            conexao = DriverManager.getConnection(url);           
            
            st = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);                           
        }
        catch (ClassNotFoundException Driver)
        {
        	Log.e("SQL","Erro: "+Driver);
        }
        catch (SQLException Fonte)
        {
        	Log.e("SQL","Erro: "+Fonte);
        }  
    }
    
    public void gravar (String nome)
    {
        StringBuilder sql = new StringBuilder();
        try
        {
            conecta();
         
           /* sql.append("insert into Cidades values ("+nome+") ");            
            st.execute(sql.toString());  */
        }
        catch (Exception e)
        {        	
        	Log.e("SQL","Erro: "+e);
        }          
    }
    
}

qdo chamo a função conecta(); vem o erro: android.os.NetworkOnMainThreadException

alguém sabe como posso resolver isso, por favor?

Aparentemente vc esta conectando no banco pela thread principal do seu aplicativo.

O seu problema eh muito simples de resolver na verdade, o que vc deve fazer eh criar uma thread separada para a conexao no banco de dados.

Se vc nao tem muita experiencia com threads aqui vai uma documentacao que vai ajudar:

http://developer.android.com/resources/articles/painless-threading.html

//Daniel

melhor seria 
[code]SQL_Server { [/code]
por que ela não e responsável por uma tela(Activity).  e provavelmente voce vai precisar instanciar ela depois. o resto e thead mesmo ou handle

http://developer.android.com/guide/practices/design/responsiveness.html

melhor seria

por que ela não e responsável por uma tela(Activity). e provavelmente voce vai precisar instanciar ela depois. o resto e thead mesmo ou handle

http://developer.android.com/guide/practices/design/responsiveness.html

ok, fiz uma outra thread e deu certo… valleeww

bem, nao deu tão certo assim, agora o negócio é com o banco mesmo… estou tentando apenas estabelecer a conexão através dessa função miha conecta();

[code]
public class SQL_Server extends AsyncTask<String, Void, Void>
{
Gravar_Cids_TCCActivity atv = new Gravar_Cids_TCCActivity();

String driver = "net.sourceforge.jtds.jdbc.Driver";
String url = "jdbc:jtds:sqlserver://192.168.1.7:1433/BabyLar, sa, **** ";

Connection conexao;
Statement st;
ResultSet rs;

public void conecta ()
{
	try
    {
        Class.forName(driver);
        conexao = DriverManager.getConnection(url);           
        
        st = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);                           
    }
    catch (ClassNotFoundException Driver)
    {
    	Log.e("SQL","Erro: "+Driver);
    }
    catch (SQLException Fonte)
    {
    	Log.e("SQL","Erro: "+Fonte);
    }  
}

.
.
.[/code]

mas dá o seguinte erro java.sql.SQLException: Single-Sign-On is only supported on Windows. Please specify a user name.
pensei q fosse por eu tentar entrar com autenticação do windows, mas mudei a string conforme está aí em cima, autenticando pela SQL server, e ainda dá esse mesmo erro?

alguma sugestão??? valew mesmo pela atenção hein…

ok, fiz uma thread chamando minha função para acessar od dados e deu certo!!!

mas agora estou com um pequeno problema com a thrad… está em outro tópico, se puder me ajudar serei mt grato… valeeww

Boa Tarde, estou com o mesmo erro e ainda não obtive sucesso na conexão, podem me ajudar por favor amigos?

Conexão SQLServer utilizando sqljdbc4.jar

Windows 7 professional 64bits
SQLServer 2008 express
Driver: sqljdbc4.jar
Android: 4.0.3
Eclipse : Eclipse Java EE IDE for Web Developers.
Version: Indigo Service Release 2
Build id: 20120216-1857

Boa Noite, estou realizando uma conexão com o sqlserver, porém, ocorre este erro: ( [color=red]android.os.networkOnMainThreadException[/color] ), pesquisei e encontrei uma resposta dizendo que devo criar um ([color=green]Async Task[/color]), como crio este Async Task, e como sei se o driver está no local correto? Utilizei o driver definition em preferences do eclipse para associar o driver sqljdbc4.jar, foto ilustrando, está correta a associação?
{__} agradeço o help !

segue fonte para melhor entendimento:

public void conSqlServer() {
        
        // string de conexão...
        String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
          "databaseName=master;user=sa;password=senha;";
                          
        try {              
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
            // Abre a conexão
            Connection conn = DriverManager.getConnection(connectionUrl);
            // imprime na tela
            
            
            showalert("SQL SERVER conexão feita com sucesso.");
            //Toast.makeText(this, "SQL SERVER conexão feita com sucesso.", Toast.LENGTH_SHORT).show(); 
            
          }
        
        catch (ClassNotFoundException e) {  
            showalert("Driver não encontrado: " + e.getMessage()); }
        
        catch (SQLException ex) {
              // se ocorrem erros de conexão
              
              showalert("SQLException: " + ex.getMessage());
              showalert("SQLState: " + ex.getSQLState());
              showalert("VendorError: " + ex.getErrorCode());               
              
          }        
        
        catch (Exception e) {
           // se ocorrerem outros erros
              
              showalert("Problemas ao tentar conectar com o banco de dados: " + e);
          }
        o erro esta sendo neste catch (Exception e) acima ^^^^^^^^               
        }




Boa Noite!
O erro antes deste acima é o erro abaixo:

07-16 23:18:11.492: E/dalvikvm(635): Could not find class 'javax.sql.XAConnection', referenced from method com.microsoft.sqlserver.jdbc.SQLServerConnection.poolCloseEventNotify

Alguém conhece a solução?
Grato!

Galera estou trabalhando em um projeto que utiliza SQLServer e não tive muitos problema com ele não, vou explicar com que eu estou fazendo
Primeira coisa eu sempre tenho um copia igual no DB do Aplicativo, Tipo eu tenho um Base em um servidor e a mesma base no tablet, tudo criado com o mesmo script, Primeiro eu montei a classe SQLServer


import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import android.util.Log;



public class SQLServer{
	private static String TAG = "Banco Servidor";
	public Connection con;
	public Statement stmt;
	public ResultSet rs;
	private String DRIVER = "net.sourceforge.jtds.jdbc.Driver";
	public boolean testaConexao(String ip){
		InetAddress in = null;
    	try {
    		in = InetAddress.getByName(ip);
    	} catch (UnknownHostException e) {
			e.printStackTrace();
    	}
	    try {
	    	if(in.isReachable(5000)){
	    		Log.i(TAG,"Responde OK");
	    		return true;
	    	}
	    	else{
	    		Log.e(TAG,"No responde: Time out");
	    		return false;
	    	}
	    } catch (IOException e) {
	    	Log.e(TAG,e.toString());
	    }
		return false;
	}
	
	
	public int OpenTeste(String serv,String porta,String database,String user,String senha){
		String url = "jdbc:jtds:sqlserver://"+serv+":"+porta+"/"+database;
		try{
			Class.forName(DRIVER);
			Log.e(TAG,""+DriverManager.getLoginTimeout());
			DriverManager.setLoginTimeout(5000);
			Log.e(TAG,""+DriverManager.getLoginTimeout());
		    con = DriverManager.getConnection(url, user, senha); 
		    Log.i(TAG,"Conexão Aberta com Sucesso");
		    return 0;
		}catch (Exception e) {
			if (e.getMessage().equals("Network error IOException: localhost/127.0.0.1:1433 - Connection refused")){
				return 1;
			}else{
				Log.e(TAG,"Open "+e.getMessage());
				return 2;
			}
		}
	}
	public void Open(){
		try{
			Class.forName(DRIVER);
			DriverManager.setLoginTimeout(-1);
		    con = DriverManager.getConnection(ParametroTemporario.URL, ParametroTemporario.USUARIO, ParametroTemporario.SENHA);  
		    Log.i(TAG,"Conexão Aberta com Sucesso");
		}catch (Exception e) {
			Log.e(TAG,"Open "+e);	
		}
	}
	 public void Close() {
		 try{   
			 Log.i(TAG,"Conexão Servidor Fechada");
		 }finally{
            if(rs != null)
                try{ rs.close(); } catch(Exception ex){}
            if(stmt != null)
                try{ stmt.close(); } catch(Exception ex){}
            if(con != null)
                try{ con.close(); } catch(Exception ex){}
        }
	 }
}

Sempre que eu vou me conectar no servidor eu chamo a função testaConexao para ver se há conexão com o servidor por que minha aplicação poder ter acesso com o banco tanto no 3G com no Wi-Fi

Dai e rodo uma Thread para executar a sincronização de acordo com um tempo que é determinado em uma tela de configuração

Timer timer = null;  
	    if (timer == null) {  
	        timer = new Timer();  
	        TimerTask tarefa = new TimerTask() {  
	            public void run() {  
	                try {
	                	if(status){
	                		new Thread(new Runnable(){

                                         /// CODIGO DE SINCRONIZAÇÃO DAS BASE
                                        Log.i(tag,"Executando a sincronização automatica ");
		            		NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            				Notification n = new Notification(R.drawable.iniciasync,"Executando a Sincronização",System.currentTimeMillis());
            				n.setLatestEventInfo(MainActivity.this,"Executando a Sincronização","Executando a Sincronização ", null);
            				n.flags |= Notification.FLAG_AUTO_CANCEL;
            				n.defaults = Notification.DEFAULT_VIBRATE;
            				n.defaults = Notification.DEFAULT_LIGHTS;
                                        handler.post(new Runnable(){
		            		public void run(){
		            			if (tabatualiza){
		            				NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
			            			Notification n = new Notification(R.drawable.ok,"Sincronização com Sucesso",System.currentTimeMillis());
			            			n.setLatestEventInfo(MainActivity.this,"Sincronização com Sucesso","Sincronização simple concluída com sucesso", null);
			            	        	n.flags |= Notification.FLAG_AUTO_CANCEL;
			            			n.defaults = Notification.DEFAULT_VIBRATE;
			            			n.defaults = Notification.DEFAULT_LIGHTS;
			            			nm.notify(R.string.app_name,n);
			            			Log.i(tag,"Terminou com sucesso");
		            			}else{
		            				NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
			            			Notification n = new Notification(R.drawable.erro,"Erro na Sincronização",System.currentTimeMillis());
			            			PendingIntent p = PendingIntent.getActivity(MainActivity.this,0,new Intent(MainActivity.this,SincronizacaoActivity.class), 0);
			            			n.setLatestEventInfo(MainActivity.this,"Erro na Sincronização","Sincronize manualmente novamente", p);
			            			n.defaults = Notification.DEFAULT_ALL;
			            			n.flags |= Notification.FLAG_AUTO_CANCEL;
			            			nm.notify(R.string.app_name,n);
			            			Log.i(tag,"erro na sincronização automatica ");
		            		         }
		       				}
	     				});	            			
                                }
		          }).start();
	               }
            } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        };  
        timer.scheduleAtFixedRate(tarefa, TEMPO, TEMPO);  

TEMPO = (1000 * segundos)
tabatualiza ele verfica se todas as sincronizações estao ok se nao ele exibe a notificação de erro

esse codigo acima ele fica na classe principal do programa entao ele sempre vai rodar

no manifest

tem que colocar a seguinte linha

 &lt;uses-permission android:name="android.permission.VIBRATE"/&gt;
// essa duas para ter acesso a internet
&lt;uses-permission android:name="android.permission.INTERNET" /&gt;
    &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;

dai cada vez que voce for fazer a conexão com o servidor vai abrir um thread e sempre chamar assim

SQLServer connect = new SQLServer();
if(connect.testaConexao(IP DA SUA CONEXÃO OU DNS)){
// conexão ok
}else{
 //conexão com problemas
}
dai para manipular dados 
connect.open();
.
.
.
//para fazer os select insert update ... e assim vai

//sempre 
connect.stmt = connect.con.createStatement();
connect.rs = connect.stmt.executeQuery(SUA SQL);

//para buscar e para inserir

PreparedStatement query = connect.con.prepareStatement(SUA SQL);
....
....
...
query.executeUpdate();

espero ter ajudado eu fiz assim e não estou tendo problemas

Ola a todos.

Fiz o exemplo postado acima.
Mas estou recebendo o seguinte erro.

Open java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

Já adicionei a library jtds-1.2.5.jar no projeto, e nada de funcionar.
Alguem pode me ajudar?

Muito Obrigado.

Vinicius Teixeira

voce não pode adcionar a biblioteca pelo eclipse voce tem que copiar na pasta lib do projeto android no se workspace

estou tentando fazer o o mesmo,

mas o erro seguinte aparece: Open java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

ja sei que o erro é por não encontrar o driver, onde colocar e como indicar o driver?

att,

O erro tá em achar que para conectar com o banco do android é o mesmo que no desktop.

qual a solução então?

primeiro, você quer conectar com um banco em seu desktop ? ou quer criar um banco local no aparelho ?

o Cenário é o seguinte:

tenho um servidor de banco de dados: sql server 2008

quero fazer uma aplicação para rodar em 5 tablets, onde a aplicação tera apenas um textBox e um botão.

no textBox sera inserido o código de barras dos produtos e o botão vai conectar no banco e retornar a descrição em um label.

apenas isso.

tem que ser por webService, veja esse tutorial, está divido em 3 partes:

http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17389
http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17465
http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17638

sei que o tópico tá velho já, mas mesmo assim vou comentar…

não precisa NECESSARIAMENTE ser com um webservice… eu mesmo tenho uma aplicação que comunica com um banco mysql na locaweb… daí no seu caso, é só ver certinho como conecta o sql server, pois tem jeito sim… existem vários tutoriais na net por aí.

se a minha que funciona com um banco na nuvem já fica bom, no seu caso que provavelmente vai ser em rede então vai ficar melhor ainda.

logico, com um WS vai funcionar melhor, mas dá muito trabalho… rs

Cara é melhor você definir um webservice,do que dar acesso direto pela aplicação,pois você vai estar expondo informações como string de conexão no bd e senha,o que pode causar em algum momento problema eventual de segurança.

Isso é verdade…

mas se for num caso igual o meu, que não tem nenhuma informação importante no banco, e são poucas pessoas que vão usar, acredito que não tem problema… mas não tiro a importância do que o Ramon disse.

Tb tou com um erro na conexão a sql server, o meu codigo é o seguinte:

public void connection(){

		String dbName = "******";
	     String serverip="192.168.1.17";
	     String serverport="3306";
	     String url = "jdbc:sqlserver://"+serverip+"\\SERVIDOR"+serverport+";databaseName="+dbName+"";

	     
		 try {
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
	            Log.i("Status","Driver");
	            try{
	            	Log.i("Status","Quase conecta");
	            Connection conn = DriverManager.getConnection(url, "******", "*********");                   
	            Log.i("Status","Conecta");
	            Statement statement=conn.createStatement();
	            ResultSet resultSet=statement.executeQuery("SELECT COUNT(nome) FROM aluno;");
	            while(resultSet.next()){
	               
	            }
	            Log.i("Status","Cool");
	            }catch(SQLException ex) {  
	                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);  
	                Log.i("Status","Problema com SQL!");  
	        ex.printStackTrace(); 
	            	
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	          
	        }

O serverip é o ip onde se encontra a base de dados, no entanto ja rodei a aplicaçao no telefone (real device) e o erro é o mesmo. Alguém consegue ajudar? Obrigado