Java e SQL

bom dia estou com o seguinte problema criei um array de 3 posições String para consultar no banco sql server, nome, codigo e titular são campos de uma tabela titular como verão no codigo abaixo.
Problema nome string, titular e codigo são int, quando peço o retorno das informações do banco retorno o erro que o campo " " é int, e não pode ser recuperado por uma pesquisa String.

public DefaultTableModel buscarTitular(String buscar) {
	try {
		DefaultTableModel Modelo;
		// nome da colunas nas tabelas
		String titular[] = { "Codigo", "Título", "Nome" };
		String dados[] = new String[3];
		Modelo = new DefaultTableModel(null, titular);
		// like com percente no incio busca a qualquer variavel pelo inicio da palavra e no final ao contrario
		String sql = "select * from Titular where Nomass Like '%" + buscar + "%' or Codigo='"+buscar+"' or Nrotit='"+buscar+"'";
		PreparedStatement pst = cn.prepareStatement(sql);
		ResultSet rst = pst.executeQuery();
		while (rst.next()) {
			// valores retornados do bd
			dados[0] = rst.getString(Integer.parseInt("Codigo"));				
			dados[1] = rst.getString(Integer.parseInt("Nrotit"));
			dados[2] = rst.getString("Nomass");
			Modelo.addRow(dados);
		}
		return Modelo;
	} catch (Exception ex) {
		JOptionPane.showMessageDialog(null, "Digite o Código/Título/Nome corretamente!");
		return null;
	}
}

Amigo uma dica coloque o código em code para ficar fácil de ver, assim fica difícil, o provável erro é o seguinte:

//aqui vc pede para retornar String em todas, sendo que eles são int, e 
//para piorar vc ta convertendo a palavra Codigo para Int?
dados[0] = rst.getString(Integer.parseInt("Codigo"));
dados[1] = rst.getString(Integer.parseInt("Nrotit"));
dados[2] = rst.getString("Nomass");

Peça para retornar um int e depois vc converte para String já que seu array e um array de String. ex:

//Veja que agora eu pego um int do banco de dados usando o método getInt
dados[0] = Integer.toString(rst.getInt("Codigo"));
dados[1] = Integer.toString(rst.getInt("Nrotit"));
dados[2] = rst.getString("Nomass");

e só recapitulando Integer.parseInt() é para converter (passar) uma string para int ex:

//a variavel numero vai ter o valor 10;
int numero = Integer.parseInt("10");

//Esse aqui é errado já lança uma exceção do tipo NumberFormatException pois 
// joão não é um numero.
int numero = Integer.parseInt("João");
1 curtida

Outra coisa, evite juntar (concatenar) variáveis no seu sql, isso afeta a leitura e a segurança do código, usando PreparedStatement fica tudo lindo! :joy:

String sql = "select * from Titular where Nomass Like ? or Codigo=? or Nrotit=?";
PreparedStatement pst = cn.prepareStatement(sql);
pst.setString(1, "%" + buscar + "%");
pst.setString(2, buscar);
pst.setString(3, buscar);

O erro você não postou, mas imagino que seja na entrada, ou seja na tabela, se o campo Codigo for inteiro na base, você precisa mudar essa linha…

pst.setInt(2, Integer.parseInt(buscar));
1 curtida

como coloco em code???

Eu faço assim pois o code fica mais correto possivel, uso 3 acentos graves (`) no inicio e no final que nem a imagem a baixo:

Ai fica desta forma aqui:

public class MinhaClasse{}
1 curtida
public DefaultTableModel buscarTitular(String buscar) {
		try {
			DefaultTableModel Modelo;
			// nome da colunas nas tabelas
			String titular[] = { "Codigo", "Título", "Nome" };
			String dados[] = new String[3];
			Modelo = new DefaultTableModel(null, titular);
			// like com percente no incio busca a qualquer variavel pelo inicio da palavra e no final ao contrario
			String sql = "select * from Titular where Codigo=? or Nrotit=? or Nomass Like ?";
			PreparedStatement pst = cn.prepareStatement(sql);			
			pst.setString(0, Integer.parseInt(buscar));
			pst.setString(1, Integer.parseInt(buscar));		
			pst.setString(2, "%" + buscar + "%");
			return Modelo;
		} catch (Exception ex) {
			JOptionPane.showMessageDialog(null, ex);
			return null;
		}
	}

erros retornados

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems: 
	The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, int)
	The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, int)

	at br.com.sisclubes.funcoes.MTitular.buscarTitular(MTitular.java:50)
	at br.com.sisclubes.telas.Titular.busTitular(Titular.java:322)
	at br.com.sisclubes.telas.Titular.btnBuscarActionPerformed(Titular.java:307)
	at br.com.sisclubes.telas.Titular.access$0(Titular.java:306)
	at br.com.sisclubes.telas.Titular$1.actionPerformed(Titular.java:288)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
1 curtida

Edita o seu código, vc colocou outro acento, tem q ser o acento grave (`)
esse aqui oh:

1 curtida

Bom o erro é aquilo q te falei utilizando métodos incompatíveis

o método setString recebe um int e uma String ex:

pst.setString(1,"um texto");

se o campo é um número vc tem q utilizar o setInt() ex:

//esse é o correto para números
pst.setInt(0,10);
1 curtida

Me desculpem a burrice mas já fiz e refiz e não consigo arrumar o código

Primeiro nos diga os tipos das colunas no banco de dados, esse é o primeiro passo…

No caso as colunas Codigo, Nrotit e Nomass

Uma observação o banco não foi feito por mim.

Ok, vamos lá, o primeiro passo seria nos símbolos da sua query…

String sql = "select * from Titular where Codigo=? or Nrotit=? or Nomass Like ?";

Quando você marca cada posição com um ? está dizendo para o java que vai definir os valores depois… onde cada posição vai ter um número de identificação (começando sempre do 1) pela ordem da esquerda para direita, tranquilo até aqui?

Porém para cada posição você precisa olhar na base e ver o tipo compatível, onde para campos VARCHAR por exemplo, temos o tipo setString, para tipos INT temos o setInt, para DATE ou DATETIME temos o setDate e assim por diante…

pst.setInt(1, Integer.parseInt(buscar)); //porque Codigo é INT na base...
pst.setInt(2, Integer.parseInt(buscar)); //porque Nrotit é INT na base...		
pst.setString(3, "%" + buscar + "%"); //porque Nomass é VARCHAR na base...

Clareou mais essa parte?

1 curtida

sim

Então tente resolver essa primeira parte e veja se o erro persiste, caso algum outro erro aconteça post aqui…

Então fica assim ??

public DefaultTableModel buscarTitular( String buscar) {
		try {
			DefaultTableModel Modelo;
			// nome da colunas nas tabelas
			String titular[] = { "Codigo", "Título", "Nome" };
			String dados[] = new String[3];
			Modelo = new DefaultTableModel(null, titular);
			// like com percente no incio busca a qualquer variavel pelo inicio da palavra e no final ao contrario
			String sql = "select * from Titular where Codigo=? or Nrotit=? or Nomass Like ?";
			PreparedStatement pst = cn.prepareStatement(sql);
			ResultSet rst = pst.executeQuery();
			while (rst.next()) {
				// valores retornados do bd							
				pst.setInt(0, Integer.parseInt(buscar));
				pst.setInt(1, Integer.parseInt(buscar)); 		
				pst.setString(2, "%" + buscar + "%"); 			
				Modelo.addRow(dados); <---- por qual variável recebo esses dados de volta pra ca, pois antes recebia em dados e passava 
			}
			return Modelo;
		} catch (Exception ex) {
			JOptionPane.showMessageDialog(null, ex);
			return null;
		}
	}

pra ca

// chamar metodo buscar usuario do objeto DUsuarios
	private void busTitular(String buscar) {
		DefaultTableModel Modelo;
		MTitular Funcao = new MTitular();
		Modelo = Funcao.buscarTitular(buscar);
		tblTitular.setModel(Modelo);
	}

Até aí nenhum erro Jovem?

O valor não está definido para o parâmetro 1!

Volto a frisar, para cada ? dentro do sql, você tem um setAlgumaCoisa começando pelo 1 e não pelo 0, viu o exemplo que mostrei…

pst.setInt(1, Integer.parseInt(buscar)); //porque Codigo é INT na base...
pst.setInt(2, Integer.parseInt(buscar)); //porque Nrotit é INT na base...		
pst.setString(3, "%" + buscar + "%"); //porque Nomass é VARCHAR na base...

Ajuste isso que lhe mostro como criar os dados (termo técnico é popular) para TableModel…

public DefaultTableModel buscarTitular( String buscar) {
		try {
			DefaultTableModel Modelo;
			// nome da colunas nas tabelas
			String titular[] = { "Codigo", "Título", "Nome" };
			String dados[] = new String[3];
			Modelo = new DefaultTableModel(null, titular);
			// like com percente no incio busca a qualquer variavel pelo inicio da palavra e no final ao contrario
			String sql = "select * from Titular where Codigo=? or Nrotit=? or Nomass Like ?";
			PreparedStatement pst = cn.prepareStatement(sql);
			ResultSet rst = pst.executeQuery();
			while (rst.next()) {
				// valores retornados do bd							
				pst.setInt(1, Integer.parseInt(buscar)); 
				pst.setInt(2, Integer.parseInt(buscar));		
				pst.setString(3, "%" + buscar + "%");			
				Modelo.addRow(dados); 
			}
			return Modelo;
		} catch (Exception ex) {
			JOptionPane.showMessageDialog(null, ex);
			return null;
		}
	}

Não cara, ainda tá errado, uma coisá é o set para alimentar o sql, outra é o get para pegar da consulta…

Veja se isso resolve e preste bem atenção onde os sets e os gets ficam no código… criei variáveis a mais para você entender bem o passo a passo…

public DefaultTableModel buscarTitular( String buscar) {
    try {
        // nome da colunas nas tabelas
        String titular[] = { "Codigo", "Título", "Nome" };
        DefaultTableModel Modelo = new DefaultTableModel(null, titular);
        // like com percente no incio busca a qualquer variavel pelo inicio da palavra e no final ao contrario
        String sql = "select * from Titular where Codigo=? or Nrotit=? or Nomass Like ?";
        PreparedStatement pst = cn.prepareStatement(sql);

        // parametros para alimentar seu sql...
        pst.setInt(1, Integer.parseInt(buscar)); 
        pst.setInt(2, Integer.parseInt(buscar));
        pst.setString(3, "%" + buscar + "%");		

        ResultSet rst = pst.executeQuery();
        while (rst.next()) {
            // valores retornados do bd
            Integer codigo = rst.getInt("Codigo");
            Integer titulo = rst.getInt("Nrotit");
            String nome = rst.getString("Nomass");

            //monta linha da tabela
            Object[] dados = new Object[3];
            dados[0] = codigo;
            dados[1] = titulo;
            dados[2] = nome;

            // adiciona linha na tabela
            Modelo.addRow(dados);
        }
        return Modelo;
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex);
        return null;
    }
}