Olá, estou com um projeto da facul, no qual estou montando um sistema para uma locadara de veiculos.
No programa, tenho uma Jtable, que preencho com alguns dados da um tabela que tenho no banco, e tb preencho alguns campos que tenho no formulario, mas na tabela que estou presquisando, só tem o codigo do cliente, e não o nome, ae nisso tenho que pegar o codigo, e pesquisar na tabela clientes o nome.
Em sql eu sei fazer essa pesquisa, mas o professor, disse que não quer assim, ele quer duas pesquisas separadas, uma na tabela reservas, e para pega o nome, pesquisar na tabela clientes.
ae esta um trecho do meu codigo:
[code]package locadoraveiculos;
//import javax.swing.;
import javax.swing.table.DefaultTableModel;
import java.util.;
import javax.swing.;
import java.sql.;
/**
*
-
@author Ediley
*/
public class Reservas extends javax.swing.JInternalFrame {
private String url = “jdbc:mysql://localhost:3306/locadora”;
private String driver = “com.mysql.jdbc.Driver”;
private Connection con;
private Statement st,st2;
private ResultSet rs,rs2;
/** Creates new form Reservas */
public Reservas() {
initComponents();
atualizaCampos(“reservas”, 8);
atualizaCamposForm();
}
@SuppressWarnings(“unchecked”)
private void conectaBanco(String tabela){
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "root", "123");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select reserva.*,cliente.nom_cli,funcionario.nom_fun from reserva, cliente, funcionario ");
st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.getMessage());
}
}
Ae nesse caso, na parte onde tento obter o ResultSet do rs2, da problema.
Quer disser o problema eh quando abro o programa, que ja mostra na tela o erro java.sql.Exception, mas nao mostra o erro.
Como eu poderia fazer isso.
Você esqueceu de fechar o CODE.
Você não precisa criar outro Statement…
E qual é o ero, exatamente?? Pega o StackTrace.
[quote=thegoergen]Você esqueceu de fechar o CODE.
Você não precisa criar outro Statement…
E qual é o ero, exatamente?? Pega o StackTrace.[/quote]
ops…
ae tah o codigo com o code fechado
[code]package locadoraveiculos;
//import javax.swing.;
import javax.swing.table.DefaultTableModel;
import java.util.;
import javax.swing.;
import java.sql.;
/**
*
-
@author Ediley
*/
public class Reservas extends javax.swing.JInternalFrame {
private String url = “jdbc:mysql://localhost:3306/locadora”;
private String driver = “com.mysql.jdbc.Driver”;
private Connection con;
private Statement st,st2;
private ResultSet rs,rs2;
/** Creates new form Reservas */
public Reservas() {
initComponents();
atualizaCampos(“reservas”, 8);
atualizaCamposForm();
}
@SuppressWarnings(“unchecked”)
private void conectaBanco(String tabela){
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "root", "123");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select * from reserva");
st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.getMessage());
}
}
[/code]
Ele compila normal, mas quando executo ele uma uma caixa de mensagem com o titulo, java.sql.Exception, e sem nenhum msg.
Amigo, usa inner join que dá pra fazer tudo em uma consulta só.
algo tipo:
select tb1.cod,tb2.nome,tb1.campo2,tb1.campoN from tabela1 tb1
join tabela2 tb2 on tb1.cliente = tb2.cod;
Assim voce receberia o nome do cliente extraido da tabela dois em vez do cod dele que está na tabela 1.
Valeu.
[quote=edileyoliveira][quote=thegoergen]Você esqueceu de fechar o CODE.
Você não precisa criar outro Statement…
E qual é o ero, exatamente?? Pega o StackTrace.[/quote]
ops…
ae tah o codigo com o code fechado, olha nesse codigo agora, pq agora corrigi meu select, o outro eu tava pegando td num consulta soh.
[code]package locadoraveiculos;
//import javax.swing.;
import javax.swing.table.DefaultTableModel;
import java.util.;
import javax.swing.;
import java.sql.;
/**
*
-
@author Ediley
*/
public class Reservas extends javax.swing.JInternalFrame {
private String url = “jdbc:mysql://localhost:3306/locadora”;
private String driver = “com.mysql.jdbc.Driver”;
private Connection con;
private Statement st,st2;
private ResultSet rs,rs2;
/** Creates new form Reservas */
public Reservas() {
initComponents();
atualizaCampos(“reservas”, 8);
atualizaCamposForm();
}
@SuppressWarnings(“unchecked”)
private void conectaBanco(String tabela){
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "root", "123");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select * from reserva");
st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.getMessage());
}
}
[/code]
Ele compila normal, mas quando executo ele uma uma caixa de mensagem com o titulo, java.sql.Exception, e sem nenhum msg.[/quote]
[quote=lokidarkeden]Amigo, usa inner join que dá pra fazer tudo em uma consulta só.
algo tipo:
select tb1.cod,tb2.nome,tb1.campo2,tb1.campoN from tabela1 tb1
join tabela2 tb2 on tb1.cliente = tb2.cod;
Assim voce receberia o nome do cliente extraido da tabela dois em vez do cod dele que está na tabela 1.
Valeu.[/quote]
O problema é justamente esse, fazer td em uma consulta só eu sei, mas o professor nao quer que faça uma consulta só, pois isso eh na materia de bd, ele ker que a gente aprenda a fazer varias cosultas.
Amigo, troca o e.getMessage por e.toString em:
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.getMessage());
}
ficando:
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.toString());
}
compila, executa e posta o erro ai.
valeu.
[quote=lokidarkeden]Amigo, troca o e.getMessage por e.toString em:
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.getMessage());
}
ficando:
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
mostraErro(e.toString());
}
compila, executa e posta o erro ai.
valeu.[/quote]
Blz…to no trampo agora, assim que chegar em ksa eu vejo e posto
Dá um printStackTrace…
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
e.printStackTrace();
mostraErro(e.toString());
}
Daí pega o StackTrace… fica mais fácil de ver a linha do erro…
[quote=thegoergen]Dá um printStackTrace…
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
e.printStackTrace();
mostraErro(e.toString());
} [/code]
Daí pega o StackTrace... fica mais fácil de ver a linha do erro...[/quote]
Ae, eu fiz o que vc flw, mas observei que no metodo onde tah os Statement e os ResultSet, eu coloquei o e.printStackTrace() no bloco catch, e nao retornou nd, mas quando eu coloquei no metodo onde eu vou o segundo resultset ele deu os seguintes erros no console:
[code]java.sql.SQLException
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488)
at locadoraveiculos.Reservas.atualizaCamposForm(Reservas.java:66)
at locadoraveiculos.Reservas.<init>(Reservas.java:32)
at locadoraveiculos.Principal.<init>(Principal.java:17)
at locadoraveiculos.Main.main(Main.java:19)
ae esta o a parte completa do codigo:
[code] private void conectaBanco(String u){
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "root", "123");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select reserva.*,cliente.nom_cli,funcionario.nom_fun from reserva, cliente, funcionario ");
st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli='"+u+"'");
} catch (Exception e) {
mostraErro(e.toString());
}
}
private void atualizaCamposForm(){
try{
if(rs.isAfterLast()){
rs.previous();
}
else if(rs.isBeforeFirst()){
rs.next();
}
if(!rs.wasNull()){
lblCodigo.setText(String.valueOf(rs.getInt("cod_res")));
txtCodCli.setText(rs.getString("cli_res"));
txtNomCli.setText(rs2.getString("nom_cli"));
txtCodFun.setText(String.valueOf(rs.getInt("fun_res")));
txtDatRet.setText(String.valueOf(rs.getDate("dat_ret_res")));
txtHorRet.setText(String.valueOf(rs.getTime("hor_ret_res")));
txtDatDev.setText(String.valueOf(rs.getDate("dat_dev_res")));
txtHorDev.setText(String.valueOf(rs.getTime("hor_dev_res")));
txtTxMul.setText(String.valueOf(rs.getFloat("mul_res")));
txtValDia.setText(String.valueOf(rs.getDouble("val_res")));
txtDesc.setText(String.valueOf(rs.getFloat("des_res")));
txtDesc.setText(String.valueOf(rs.getFloat("des_res")));
txtNCart.setText(rs.getString("num_cart_res"));
txtNomCart.setText(rs.getString("nom_cart_res"));
txtVencCart.setText(String.valueOf(rs.getDate("ven_cart_res")));
cmbBanCart.addItem(rs.getString("band_cart_res"));
}
else{
mostraErro("A tabela está vazia");
}
}
catch(SQLException e){
e.printStackTrace();
mostraErro(e.toString(), e.getMessage());
}
catch(Exception e){
e.printStackTrace();
mostraErro(e.getMessage());
}
}
[/code]
O que eu estou querendo na verdade eh passar uma String com o codigo do cliente para o metodo ConectaBanco, para lah ele pegar essa string, e no ResultSet rs2 executar a pesquisa usando essa String, mas eu ja tentei executar um pesquisa sem usar nenhuma variavel, mas tb deu problema
[quote=thegoergen]Dá um printStackTrace…
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
e.printStackTrace();
mostraErro(e.toString());
}
Daí pega o StackTrace… fica mais fácil de ver a linha do erro…[/quote]
isso, mesmo. E trata as exceptions corretamente.
[code]
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url, “root”, “123”);
Statement st = con.createStatement(/*no mysql não precisa */);
ResultSet rs = st.executeQuery(“select * from reserva”);
Statement st2 = con.createStatement();
ResultSet rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e){
e.printStackTrace();
}[/code]
[quote=edileyoliveira][quote=thegoergen]Dá um printStackTrace…
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli=1");
} catch (Exception e) {
e.printStackTrace();
mostraErro(e.toString());
} [/code]
Daí pega o StackTrace... fica mais fácil de ver a linha do erro...[/quote]
Ae, eu fiz o que vc flw, mas observei que no metodo onde tah os Statement e os ResultSet, eu coloquei o e.printStackTrace() no bloco catch, e nao retornou nd, mas quando eu coloquei no metodo onde eu vou o segundo resultset ele deu os seguintes erros no console:
[code]java.sql.SQLException
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488)
at locadoraveiculos.Reservas.atualizaCamposForm(Reservas.java:66)
at locadoraveiculos.Reservas.<init>(Reservas.java:32)
at locadoraveiculos.Principal.<init>(Principal.java:17)
at locadoraveiculos.Main.main(Main.java:19)
ae esta o a parte completa do codigo:
[code] private void conectaBanco(String u){
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "root", "123");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select reserva.*,cliente.nom_cli,funcionario.nom_fun from reserva, cliente, funcionario ");
st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs2 = st2.executeQuery("select cliente.nom_cli from cliente where cliente.cod_cli='"+u+"'");
} catch (Exception e) {
mostraErro(e.toString());
}
}
private void atualizaCamposForm(){
try{
if(rs.isAfterLast()){
rs.previous();
}
else if(rs.isBeforeFirst()){
rs.next();
}
if(!rs.wasNull()){
lblCodigo.setText(String.valueOf(rs.getInt("cod_res")));
txtCodCli.setText(rs.getString("cli_res"));
txtNomCli.setText(rs2.getString("nom_cli"));
txtCodFun.setText(String.valueOf(rs.getInt("fun_res")));
txtDatRet.setText(String.valueOf(rs.getDate("dat_ret_res")));
txtHorRet.setText(String.valueOf(rs.getTime("hor_ret_res")));
txtDatDev.setText(String.valueOf(rs.getDate("dat_dev_res")));
txtHorDev.setText(String.valueOf(rs.getTime("hor_dev_res")));
txtTxMul.setText(String.valueOf(rs.getFloat("mul_res")));
txtValDia.setText(String.valueOf(rs.getDouble("val_res")));
txtDesc.setText(String.valueOf(rs.getFloat("des_res")));
txtDesc.setText(String.valueOf(rs.getFloat("des_res")));
txtNCart.setText(rs.getString("num_cart_res"));
txtNomCart.setText(rs.getString("nom_cart_res"));
txtVencCart.setText(String.valueOf(rs.getDate("ven_cart_res")));
cmbBanCart.addItem(rs.getString("band_cart_res"));
}
else{
mostraErro("A tabela está vazia");
}
}
catch(SQLException e){
e.printStackTrace();
mostraErro(e.toString(), e.getMessage());
}
catch(Exception e){
e.printStackTrace();
mostraErro(e.getMessage());
}
}
[/code]
O que eu estou querendo na verdade eh passar uma String com o codigo do cliente para o metodo ConectaBanco, para lah ele pegar essa string, e no ResultSet rs2 executar a pesquisa usando essa String, mas eu ja tentei executar um pesquisa sem usar nenhuma variavel, mas tb deu problema[/quote]