Concatenização com ? [RESOLVIDO]

13 respostas
Matheus_Prado

galera
como faço pra colocar “?” ao inves da concatenização que faço
li isso por aqui, mas nao consegui entender

faço assim

"insert into Venda (codvenda, codfuncionario, codproduto, quantidade, valortotal) values ("+codvenda.getText()+","+codfuncionario.getText()+","+codproduto.getText()+","+quantidade.getText()+","+valortotal.getText()+""

13 Respostas

nel

Boa tarde.

Exemplo simples:

String sql = "insert into tb_teste values (?, ?, ?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "Nome"); pstmt.setDate(3, new Date()); pstmt.executeUpdate();

Os ‘?’ são interpretados pelo PreparedStatement como parametros que você deseja passar para a sua query, por isso antes de você executar sua query, seja dando PreparedStatement.executeQuery(sql) ou PreparedStatement.executeUpdate() você seta os valores nos ‘?’. Sendo que começa pelo parametro 1, ou seja, ali no exemplo acima foram utilizando 3 ‘?’, sendo assim, ele interpreta que devem ser setados 3 parametros antes de executar a query. Entendeu ? :slight_smile:

Abraços.

Matheus_Prado

por exemplo
si eu tenho uma inserção assim

"  insert into Funcionario (codfuncionario, nome, sexo, datanascimento, telefone, observacoes) values ("+codfuncionario.getText()+",'"+nome.getText()+"','"+cbsexo.getSelectedItem().toString()+"','"+datanascimento.getText()+"','"+telefone.getText()+"','"+lista.getText()+"')"

com o uso da ?, ficaria assim.?

String sql = "insert into Funcionario (codfuncionario, nome, sexo, datanascimento, telefone, observacoes) values (?, ?, ?, ?, ?, ?)";     
PreparedStatement pstmt = con.prepareStatement(sql);     
pstmt.setInt(1, "codfuncionario.getText()");     
pstmt.setString(2, "nome.getText()"); 
pstmt.setString(3, "cbsexo.getSelectedItem().toString()");
pstmt.setString(4, "datanascimento.getText()");
pstmt.setString(5, "telefone.getText()");    
pstmt.setString(6, "lista.getText()");     
pstmt.executeUpdate();

ficaria mais ou menos assim?? =/

nel

Bom dia.

Não é mais ou menos assim, é exatamente assim! hehe…
Só fique atento a tipagem, ou seja, se é Integer no seu banco deve setar um Integer no Java e assim por diante, só um detalhe amigo, nesta linha:

Daria erro concorda? Está setando uma string em um int, então:

Todos os outros você seta uma String, mas você só coloca aspas duplas “” se quiser setar diretamente, assim:

Concorda? Porque isso: nome.getText() já retorna uma string concorda? Então o seu código seria assim:

String sql = "insert into Funcionario (codfuncionario, nome, sexo, datanascimento, telefone, observacoes) values (?, ?, ?, ?, ?, ?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(codfuncionario.getText().trim()));); pstmt.setString(2, nome.getText()); pstmt.setString(3, cbsexo.getSelectedItem().toString()); pstmt.setString(4, datanascimento.getText()); pstmt.setString(5, telefone.getText()); pstmt.setString(6, lista.getText()); pstmt.executeUpdate();

Eu recomendo que quando efetuar buscas por Strings bem como parses, você utilize ao fim da string o método trim(), assim como usei no parametro 1 (codfuncionario) para remover possíveis espaços em brancos a frente e/ou no termino da string.

Abraços.

Matheus_Prado

bom dia
amigão, agora minhas classes de cadastro estão funcionando perfeitamente
muito obrigado mesmo ;D

aproveitar sua bondade ae
mi ajuda na consulta?

fiz isso

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
  Connection con;
  con = DriverManager.getConnection("jdbc:odbc:Loja", "","");
  PreparedStatement pstmt = con.prepareStatement();
	  
  ResultSet rs = pstmt.executeQuery("SELECT * FROM Funcionario WHERE CodFuncionario=" + codfuncionario.getText());          
  rs.next();		  
		  
  codfuncionario.setText(rs.getString("CodFuncionario"));
  nome.setText(rs.getString("Nome")); 
  sexo.setText(rs.getString("Sexo")); 
  datanascimento.setText(rs.getString("Data Nascimento"));
  telefone.setText(rs.getString("Telefone"));
  lista.setText(rs.getString("Observações"));
  pstmt.close(); con.close();

dá erro nessa linha

PreparedStatement pstmt = con.prepareStatement();

obrigado

pmlm

O SQL tem de ser indicado no prepareStatement e não no executeQuery

PreparedStatement pstmt = con.prepareStatement("SELECT * FROM Funcionario WHERE CodFuncionario=?");  

pstmt.setString(codfuncionario.getText()); //Indica o código do funcionário representado pelo ?
   
ResultSet rs = pstmt.executeQuery();
Matheus_Prado

bom dia

deu erro nessa linha

pstmt.setString(codfuncionario.getText());

esse código é integer, nao tem problema estar setString nao né.?

obrigado

nel

Bom dia.

Lógico que sim, como eu disse, fique atento aos tipos no seu banco de dados e aos do Java, eles devem ser compativeis. Se no seu banco o codfuncionario é Integer, então:

Abraços.

Matheus_Prado

meu código ficou assim
compila sem erros
mas entra na exceção i dá erro

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
          Connection con;
          con = DriverManager.getConnection("jdbc:odbc:Loja", "","");
          PreparedStatement pstmt = con.prepareStatement("SELECT * FROM Funcionario WHERE CodFuncionario=?");     
          pstmt.setInt(1, Integer.parseInt(codfuncionario.getText().trim()));   
          ResultSet rs = pstmt.executeQuery(); 
          rs.next();
		  


          codfuncionario.setText(rs.getString("CodFuncionario"));
          nome.setText(rs.getString("Nome"));
          sexo.setText(rs.getString("Sexo"));
          datanascimento.setText(rs.getString("Data Nascimento"));
          telefone.setText(rs.getString("Telefone"));
          lista.setText(rs.getString("Observações"));
         pstmt.close(); con.close();
nel

Altere dois itens:

Retire o ‘*’ e faça a busca em todos os campos que deseja, assim:

//coloquei apenas três campos, mas no seu caso coloque todos os que voê deseja PreparedStatement pstmt = con.prepareStatement("SELECT CodFuncionario, Nome, Sexo FROM Funcionario WHERE CodFuncionario=?");

Outro detalhe, faça um if no next para ter certeza que há alguma informação nele:

if(rs.next()){ codfuncionario.setText(rs.getString("CodFuncionario")); nome.setText(rs.getString("Nome")); sexo.setText(rs.getString("Sexo")); datanascimento.setText(rs.getString("Data Nascimento")); telefone.setText(rs.getString("Telefone")); lista.setText(rs.getString("Observações")); } stmt.close(); con.close();

Abraços.

Matheus_Prado

é rapaiz
nao to dando sorte mesmo

ainda tem algum erro ae

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
          Connection con;
          con = DriverManager.getConnection("jdbc:odbc:Loja", "","");
          PreparedStatement pstmt = con.prepareStatement("SELECT CodFuncionario, Nome, Sexo, DataNascimento, Telefone, Observacoes FROM Funcionario WHERE CodFuncionario=?");     
          pstmt.setInt(1, Integer.parseInt(codfuncionario.getText().trim()));

          ResultSet rs = pstmt.executeQuery(); 

if(rs.next()){ 
          codfuncionario.setText(rs.getString("CodFuncionario"));
          nome.setText(rs.getString("Nome"));
          sexo.setText(rs.getString("Sexo"));
          datanascimento.setText(rs.getString("Data Nascimento"));
          telefone.setText(rs.getString("Telefone"));
          lista.setText(rs.getString("Observações"));
          pstmt.close(); con.close();
}
nel

Opa.

Esta linha:

CodFuncionario é Integer, então porque está dando um getString? :slight_smile:
Faça:

Esta linha: pstmt.close(); con.close();
Deixa fora do seu if, afinal, você deve fechar isso sempre, com ou sem resultados e também feche o ResultSet - rs.close();
Mais uma dica, pode substituir os nomes das colunas por número de acordo com a sequencia delas, supondo que você pegou os nomes pela sequencia correta ( primeira coluna, segunda coluna…) pode fazer assim:

codfuncionario.setText(rs.getInteger(1)); nome.setText(rs.getString(2)); sexo.setText(rs.getString(3)); datanascimento.setText(rs.getString(4)); telefone.setText(rs.getString(5)); lista.setText(rs.getString(6));

Vou repetir pela terceira vez amigo, fique atento aos tipos que se encontram no seu banco de dados pois no Java devem ser do mesmo tipo ou compatíveis ok? E mais um detalhe, se voltar a ocorrer erros, poste o erro.

Abraços.

Matheus_Prado

show de bola demais
funcionou certim agora

queria agrader a força ae cara
muito obrigado mesmo ;D

nel

Que isso cara, que bom que funcionou!

Qualquer dúvida só postar ai que o pessoal aqui do GUJ é bem atencioso.
Abraços!

Criado 15 de novembro de 2009
Ultima resposta 19 de nov. de 2009
Respostas 13
Participantes 3