Utlizar duas consulta sql na mesma clase

12 respostas
U

[size=24]Por getileza, Algem poderia me ajudar[/size]

Criei um função que conecta com o mysql e fazer a consulta retornando um tipo ResultSet, mas se tento utilizar essa função na mesma classe erra o erro

“[color=red]java.sql.SQLException: Before start of result set”[/color][size=18] [/size]

algem tem alguma solução
Grato

12 Respostas

drsmachado

E como este código está? Ou você pensa que somos adivinhos?

U

Função para retornar os registro do banco:

public ResultSet conectar( String sql) {
        Connection conn = null;
         ResultSet rs = null;
        try {
            Class.forName(STR_DRIVER);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            conn = (Connection) DriverManager.getConnection(STR_CON + "?user=" + USER + "&password=" + PASSWORD);
        } catch (SQLException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
            System.out.println("A conexão foi um sucesso\n");
            Statement stm = null;
        try {
            stm = conn.createStatement();
        } catch (SQLException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
           
        try {
            rs = stm.executeQuery(sql);
            
            
        } catch (SQLException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
           System.out.println("\n\nConsulta realizada com sucesso!!!\n");
       
           
           return (rs);

       
        }
chamando função:
rs = conexao.conectar(sql);
drsmachado

Camarada, não somos cegos, então, por que mudar a fonte para uma tão grande?
Segundo, quando colocar código, faça uso da tag [code]

U

Agora esta de acordo com oque o site pede

drsmachado

Camarada, de onde tirou essa coisa horrível?
Não sei o que pretende fazer, mas, jamais faça isso.
Primeiro, não use Statement, ele é suscetível a SQL Injection, é inseguro e ultrapassado. Prefira PreparedStatement.
Segundo, não retorne um ResultSet, você precisa tratar os dados enquanto ele está aberto e, isso deve ser feito na camada onde a conexão com o banco é realizada. Ou seja, na mesma classe em que você está trabalhando.

U

Como seria o melhor maneira de execultar um comando sql e pegar os registro que retorna?

U

Tentai procar o PreparedStatement mas nã consegui

conexao.java

public Connection abrirconexao(){
        try {
            Class.forName(STR_DRIVER);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
          
        try {
            conn = (Connection) DriverManager.getConnection(STR_CON + "?user=" + USER + "&password=" + PASSWORD);
        } catch (SQLException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
            return (conn);
        }
        public void fecharconexao(){
        try {
          if(conn.isClosed()){
          System.out.println("conexao aberta");
          }
          else{ 
              System.out.println("conexao fechada");
            conn.close();
          }
        } catch (SQLException ex) {
            Logger.getLogger(conectarmysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        }

gerarxml.java

import abcz.conectarmysql;
import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;

/**
 *
 * @author Not4
 */
public class cdcpastoxml {

    public void gerarlmx() throws IOException, SQLException, TransformerConfigurationException, TransformerException {
 
         try {

            ArrayList<String> touro = new ArrayList();
            ArrayList<String> raca = new ArrayList();
            ArrayList<String> graudesangue = new ArrayList();
            ArrayList<String> Sigla = new ArrayList();
            ArrayList<String> Manejo = new ArrayList();
            ArrayList<String> RGD = new ArrayList();
            ArrayList<Integer> quanttouro = new ArrayList();
            conectarmysql conexion = new conectarmysql();
            PreparedStatement pres;
            ResultSet  rs;
           String sql = ("select s.nome, COUNT(*) as quanttouro,s.Raca,s.graudesangue,s.Sigla,s.Manejo,s.RGD "
                    + "FROM animais a "
                    + "			LEFT JOIN reprodutivo_aspiracao_animais raa ON a.Codigo = raa.Coddoadora "
                    + "			LEFT JOIN animais s ON s.Nome = raa.Touro "
                    + "			LEFT JOIN protanimais prota ON raa.Coddoadora = prota.CodAnimal AND prota.CodProt=raa.Numprotocolo "
                    + "		WHERE (raa.Tipo=\"MN\") AND raa.Codigo IN ( "
                    + "			SELECT abczcdcpasto.cod_protocolo "
                    + "			FROM abczcdcpasto) "
                    + "			GROUP by s.Nome "
                    + "			ORDER BY s.Nome ");
             pres= conexion.abrirconexao().clientPrepareStatement(sql);
               
          
            rs = pres.executeQuery();
           
           while (rs.next()) {
                touro.add(rs.getString("s.nome"));
                raca.add(rs.getString("s.raca"));
                graudesangue.add(rs.getString("s.graudesangue"));
                Sigla.add(rs.getString("s.Sigla"));
                Manejo.add(rs.getString("s.Manejo"));
                RGD.add(rs.getString("s.RGD"));
                quanttouro.add(rs.getInt("quanttouro"));
            }
           System.out.println("touro");
           rs.close();
           pres.close();
            int cdc = 0;
            int cont = 0;
            while (touro.size() > cont) {

                int quantdadetouro = 0;
                do {
                    System.out.println(quantdadetouro);
                    cdc++;
                    
                   sql = ("SELECT DATE_FORMAT(raa.DataDose1,'%m') AS mes, prota.Codigo, raa.Codigo,s.Aptidao,s.Sigla,s.manejo,s.Raca,s.RGD,raa.touro,"
                            + "a.Raca,a.Aptidao,a.RGD,a.Nome,a.Sigla,a.Manejo,raa.Protocolo "
                            + "FROM animais a "
                            + "LEFT JOIN reprodutivo_aspiracao_animais raa ON a.Codigo = raa.Coddoadora "
                            + "LEFT JOIN animais s ON s.Nome = raa.Touro "
                            + "LEFT JOIN protanimais prota ON raa.Coddoadora = prota.CodAnimal AND prota.CodProt=raa.Numprotocolo "
                            + "WHERE (raa.Tipo=\"MN\") AND raa.Codigo IN ( "
                            + "SELECT abczcdcpasto.cod_protocolo "
                            + "FROM abczcdcpasto) "
                            + "ORDER BY s.Nome "
                            + "limit " + String.valueOf(quantdadetouro + "," + quantdadetouro + 3));
                   pres= conexion.abrirconexao().clientPrepareStatement(sql);
                   rs = pres.executeQuery();

                    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder docBuilder;
                   
                        docBuilder = docFactory.newDocumentBuilder();
                   
                    org.w3c.dom.Document doc = docBuilder.newDocument();

                    Element rootElement = doc.createElement("documento");
                    doc.appendChild(rootElement);

                    Element numero = doc.createElement("numero");
                    numero.appendChild(doc.createTextNode(String.valueOf(cdc)));
                    rootElement.appendChild(numero);

                    Element tipo = doc.createElement("tipo");
                    tipo.appendChild(doc.createTextNode("CDCMN"));
                    rootElement.appendChild(tipo);
                    
                    Element ano = doc.createElement("ano");
                    ano.appendChild(doc.createTextNode(""));
                    rootElement.appendChild(ano);
                    
                    Element mes = doc.createElement("mes");
                    mes.appendChild(doc.createTextNode( rs.getString("mes")));
                    rootElement.appendChild(mes);
                    
                    Element dia = doc.createElement("dia");
                    dia.appendChild(doc.createTextNode("CDCMN"));
                    rootElement.appendChild(dia);

                    // staff elements
                    Element staff = doc.createElement("teste");
                    rootElement.appendChild(staff);


                    Element firstname = doc.createElement("numero");
                    firstname.appendChild(doc.createTextNode("1"));
                    staff.appendChild(firstname);

                    // lastname elements
                    Element lastname = doc.createElement("tipo");
                    lastname.appendChild(doc.createTextNode("CDCIA"));
                    staff.appendChild(lastname);

                    // nickname elements
                    Element nickname = doc.createElement("mes");
                    nickname.appendChild(doc.createTextNode("02"));
                    staff.appendChild(nickname);

                    // salary elements
                    Element salary = doc.createElement("ano");
                    salary.appendChild(doc.createTextNode("2013"));
                    staff.appendChild(salary);

                    quantdadetouro = quantdadetouro + 3;

                    TransformerFactory transformerFactory = TransformerFactory.newInstance();
                    Transformer transformer = transformerFactory.newTransformer();
                    transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
                    doc.setXmlStandalone(true);
                    DOMSource source = new DOMSource(doc);
                    StreamResult result = new StreamResult(new File("C:\\cdc/CDCPASTO"+cdc+".xml"));
                    result.toString();
                    transformer.transform(source, result);
                    System.out.println("File saved!");
                } while (quanttouro.get(cont) > quantdadetouro);

                cont++;
            }

           } catch (ParserConfigurationException ex) {
                      Logger.getLogger(cdcpastoxml.class.getName()).log(Level.SEVERE, null, ex);
             }
    }
}

ele gera o erro
[color=red]SEVERE: null
java.sql.SQLException: Before start of result set [/color]

freakazoid

Opa eae urbano, blz?!

Primeira dica: como boa pratica para nome de variáveis utilize o padrão lowerCamelCase, a não ser claro que seja uma constante.
Segunda dica: sempre quando precisar concatenar muitas Strings em java use o StringBuilder por questões de estética e performance, principalmente se for fazer isso dentro de um laço de repetição.

Segue um exemplo bem básico utilizando PreparedStatement:

public void incluir(Contato contato) throws SQLException {

		conn = Conexao.getConexao();
		PreparedStatement ps = null;
		String sql = ("INSERT INTO tb_contato_caelum(NOME, EMAIL, ENDERECO, URL ,DATA) VALUES(?,?,?,?,?)");

		try {

			conn.setAutoCommit(false);

			ps = conn.prepareStatement(sql);
			ps.setString(1, contato.getNome());
			ps.setString(2, contato.getEmail());
			ps.setString(3, contato.getEndereco());
			ps.setString(4, contato.getUrl());

			ps.setDate(5, new java.sql.Date(System.currentTimeMillis()));

			ps.execute();
			conn.commit();
			

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

		} finally {

			try {

				conn.setAutoCommit(true);
				if (!ps.isClosed() && ps != null)
					ps.close();
				if (!conn.isClosed() || conn != null)
					conn.close();

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

		}

	}

Abs!

gmmascarin

urbano, bem vindo ao fórum!

Te indico tomar algumas ações:
[list]Tenha certeza que sua query está correta: Pegue ela pelo modo debug ou imprime no console e execute no banco para confirmar.[/list]
[list]Veja aqui alguns exemplos de códigos para o que você precisa.[/list]
[list]Tente melhorar seu código. Tente separar as funções do seu sistema. Dá maneira como está escrito, você provavelmente terá problemas futuros. Separe melhor as responsabilidades.[/list]

Percebi que você está trabalhando com XML, tem um framework chama XStream que é uma mão na roda.

Qualquer dúvida posta aí.

Abraços e Boa Sorte

U

O meu poblema e fazer uma consulta sql e tentar outra consulta ai gera erro
[color=red]SEVERE: null
java.sql.SQLException: Before start of result set [/color]

sera que você tem um exemplo de duas consulta sql no mesmo .java para ter de referencia?

Grato

freakazoid

Eu optaria por dois métodos distintos e trataria os retornos em outra camada. Uma BO provavelmente.

Mas sei la se for uma restrição aí do seu projeto, (vou dar uma viajada agora rs ) vc pode colocar como retorno do seu método um List do tipo Object, aí vc adiciona os retornos dos dois selects.

Abs!

gmmascarin

Conforme escrevi anteriormente, veja no link: http://www.guj.com.br/java/40126-exemplo-de-preparedstatement

Execute uma query simples para testar seu código. Exemplo: select * from animais limit 10

Criado 8 de março de 2013
Ultima resposta 8 de mar. de 2013
Respostas 12
Participantes 4