Conexão com SQL Server

15 respostas
tifyzinha

Olá Amigos,

Fiz uma classe de conexão com o SQL Server, mas estou tentando executar para ver se esta funcionando corretamente…
Mas acho que esta errado alguma coisa e não estou encontrando o erro.

import java.sql.*;

public class ConnectionFactory {
	private static final String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";
	private static final String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
	private static final String usuario = "sa";
	private static final String senha = "";
	
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName(driver);
			System.out.println("Conectando ao banco");
			
			return DriverManager.getConnection(url, usuario, senha);
			
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		} catch (SQLException e){
			throw new SQLException(e.getMessage());
		}
	}
	
	public static void main(String[] args) throws SQLException {
		ConnectionFactory conection = new ConnectionFactory();
		conection.getConnection();
	}
}

Agradeço a ajuda.

bjos

Tify

15 Respostas

cv1

O que acontece quando vc roda esse codigo?

tifyzinha

Ele dá um warning.

E se eu executo dá um pau…

“Fatal Exception occured. Program will exit”

No warning ele pede para remover o modificador static do método…

obrigada.

Ti

_fs

Cara, se você só ficar jogando a exceção pra lá e pra cá, não adianta nada hehe tem que tratá-la, ou ao menos imprimí-la, em algum lugar.

Faça assim:

public static void main(String[] args) {
	Connection conn = null;
	try {
		conn = ConnectionFactory.getConnection();
	}
	catch( Exception e ) {
		e.printStackTrace();
	}
	finally {
		try { 
			if( conn != null ) conn.close();
		}
		catch( Exception e } { 
			e.printStackTrace();
		}
	}
}

Se você não entendeu o warning sobre método estático, sugiro que estude um pouco mais as bases do Java antes de partir para acesso a dados. Aqui algumas explicações sobre o modificador:
http://www.leepoint.net/notes-java/flow/methods/toot-statmeth.html

tifyzinha

Lipe…

Desculpe a ignorancia, mas é q estou começando em Java agora…
Tentei incluir a alteração que vc sugeriu(e muito bem sugerida), mas mesmo assim tá com algum errinho…

import java.sql.*;

public class ConnectionFactory {
	private static final String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";
	private static final String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
	private static final String usuario = "sa";
	private static final String senha = "";
	
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName(driver);
			System.out.println("Conectando ao banco");
			
			return DriverManager.getConnection(url, usuario, senha);
			
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		} catch (SQLException e){
			throw new SQLException(e.getMessage());
		}
	}
	
	 public static void main(String[] args) {
	 	Connection conn = null;
	 	try {
	 		conn = ConnectionFactory.getConnection();
	 	}
	 	catch(Exception e) {
	 		e.printStackTrace();
	 	}
	 	finally {
	 		try { 
	 			if( conn != null ) conn.close();
	 		}
	 		catch(Exception e} { 
	 			e.printStackTrace();
	 		}
	 	}
	 }
}

Só mais uma coisinha…pra que serve o finaly?

Desculpe se a pergunta é mto primária…

bjos… :oops: :oops: :oops: :oops: :oops: :oops: :oops:

_fs
  1. Poste o stack trace da exceção (o texto que aparece no console), assim vai ser possível te ajudar.

  2. O bloco finally é executado independente do sucesso ou não do que ocorre no bloco try e catch. Por exemplo:

RecursoCaro recurso = null;
try {
     recurso = abrirRecurso(); // sucesso
     operacaoPerigosa.executar(); // erro, vai para o catch
}
catch( Exception e ) {
     e.printStackTrace(); // erro é impresso
}
finally {
     if( recurso != null ) // se o recurso foi inicializado com sucesso
          recurso.close(); // fecha o recurso caro que não pode ficar aberto
}

Ou seja, mesmo que alguma coisa dê errado, os recursos caros (como um objeto Connection) são finalizados mesmo assim.

  1. Sempre feche a conexão. Abra-a quando precisa e feche-a assim que possível.

  2. O driver JTDS para Sql Server é comprovadamente melhor que o driver da Microsoft :smiley: Uso e recomendo.
    http://jtds.sourceforge.net/

  3. E, sério, não peça desculpas por ignorância :smiley: não há culpa em algo desse tipo hehe

tifyzinha

Lipe, muito obrigada pelo seu apoio e incentivo.

08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path 08/08/2005 15:10:08 java.util.jar.Attributes read WARNING: Duplicate name in Manifest: Class-Path java.lang.NoClassDefFoundError: com/microsoft/jdbc/base/BaseDriver at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at br.com.infoway.modelo.factory.ConnectionFactory.getConnection(ConnectionFactory.java:13) at br.com.infoway.modelo.factory.ConnectionFactory.main(ConnectionFactory.java:28) Exception in thread "main"

  1. Legal, mas eu preciso colocar um outro comando de try catch dentro do finaly???

  2. Esse conceito de abrir e fechar a conexão eu não entendo…
    por exemplo, no asp naum se fecha as conexoes até todas as oporações serem realizadas…é eprocessados em paralelo…

Pq eu tenho a necessidade de fechar e abrir SEMPRE uma conexão???

Não posso deixar aberta e fecha-la somente qdo eu sair da aplicação???

  1. Vou experimentar!

  2. Obrigada mesmo…de coração!!!

:oops: :oops: :oops: :oops: :oops: :oops: :oops:

_fs
  1. Agora o problema pode ser resolvido :smiley:

Falta o jar do driver no classpath da sua aplicação. Declare a biblioteca no manifest. Se esta biblioteca já está declarada o problema provavelmente tem a ver com este warning:

WARNING: Duplicate name in Manifest: Class-Path
  1. Neste caso precisa pois o fechamento do objeto Connection também pode lançar exceções. Para evitar colocar esse código feio de try/catch/finally/try/catch o tempo todo, pode inserir mais um método em sua classe ConnectionFactory:
public static void closeConnection( Connection conn ) {
    if( conn != null ) {
        try {
            conn.close();
        }
        catch( SQLException e ) {
            e.printStackTrace();
        }
    }
}
  1. Você pode sim executar blocos de comandos próximos com uma mesma Connection. Isso é recomendado até. Exemplo:
Connection conn = ConnectionFactory.getConnection();
// executa um update
// executa um insert
// deleta algumas coisas
ConnectionFactory.closeConnection( conn );

Quanto a deixá-la aberta, é ruim. Mesmo que você tenha certeza que apenas uma conexão vai ficar aberta, não é legal. O que pode acontecer é daqui algumas semanas você voltar ao fórum falando que o servidor cai toda hora por causa de memória, ou que a aplicação fica muito lenta no cliente :smiley:

  1. Para se convencer, veja este benchmark :smiley:
    http://jtds.sourceforge.net/benchTest.html

  2. :smiley:

tifyzinha

“Lipe”:

Falta o jar do driver no classpath da sua aplicação. Declare a biblioteca no manifest. Se esta biblioteca já está declarada o problema provavelmente tem a ver com este warning:
Code:
WARNING: Duplicate name in Manifest: Class-Path

Lipe, primeiro…
Como eu coloco o jar no classpath??? Eu preciso apenas adicionar como external jar???
Se for isso, já esta feito!

O que é Manifest???

Como ele poderia estar duplicado??

:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

tifyzinha

Como eu faço???

bjos

_fs

Antes de mais nada, sua aplicação é web ou não? Esta rodando o programa a partir da IDE ou não?

tifyzinha

Aplicação web sim…mas eu só uso o método main pra testar a conexão…

Estou usando Eclipse 3.1…

:smiley:

_fs

Ok, então duas coisas:

  1. No package-explorer, botão direito no seu projeto >> properties >> java build path >> no painel da direita clique em ‘add external JARs…’ e encontre o jar com o driver.

  2. Após isso para sua aplicação também funcionar fora do Eclipse, adicione o JAR do driver dentro da pasta WEB-INF/lib.

oliveirarenan

Lipe,

Achei interessante esse drive JTDS.
Ele se aplica ao SQL Server???

E qual é a o desempenho dele?
E para a minha conexão, qual é o endereço do driver, url, etc??

Falowwww… :lol: :lol: :lol: :lol: :lol: :lol: :lol:

_fs

Tudo o que você perguntou tem no site ¬¬

  1. Sim.
  2. Veja o benchmark.
  3. Veja o faq do site.

:?

oliveirarenan

ops…naum tinha visto… :lol: :lol: :lol: :lol: :lol: :lol:

valeu… :stuck_out_tongue: :stuck_out_tongue:

Criado 8 de agosto de 2005
Ultima resposta 9 de ago. de 2005
Respostas 15
Participantes 4