urbano
Março 8, 2013, 5:37pm
#1
[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
E como este código está? Ou você pensa que somos adivinhos?
urbano
Março 8, 2013, 5:53pm
#3
Função para retornar os registro do banco:
[code]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);
}[/code]
chamando função:
rs = conexao.conectar(sql);
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]
urbano
Março 8, 2013, 6:03pm
#5
Agora esta de acordo com oque o site pede
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.
urbano
Março 8, 2013, 6:09pm
#7
Como seria o melhor maneira de execultar um comando sql e pegar os registro que retorna?
urbano
Março 8, 2013, 7:10pm
#8
Tentai procar o PreparedStatement mas nã consegui
conexao.java
[code]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);
}
}[/code]
gerarxml.java
[code]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);
}
}
}[/code]
ele gera o erro
[color=red]SEVERE: null
java.sql.SQLException: Before start of result set [/color]
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!
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
urbano
Março 8, 2013, 7:41pm
#11
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
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!
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