Problemas com a consulta utilizando texto

Olá,

Tenho um filtro em jsp que enviado um dado que é texto para buscar em uma tabela, quando fazia o select utuilizando um número, estava funcionando, mas com texto não funciona mais.

Este é o form que envia o dado:

<select name=“idCliente” id=“idCliente” style=“width: 100%” <%=clientes.size()==0?“disabled”:""%> onChange=“busca_contatos(this.form, this.value)”>

SELECIONE <% CadastroClientes cliente = null; for (int i=0; i ><%=cliente.getEmpresa()%> <% } %>

cliente.getEmpresa() = vinão soft

Esse é o javascript que envia para o java:
function busca_contatos(form, id) {
form.action=‘Controller?cmd=abrirhistoricocontatos&idCliente=’+id;
form.submit();
}

E esse é o java:
rs = st.executeQuery("SELECT * FROM Contato WHERE cliente = " + id);

Este é o erro:
http://localhost:8080/polo/servlet/Controller?cmd=abrirhistoricocontatos&idCliente=vinão%20soft
Syntax error or access violation, message from server: “You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘soft’ at line 1”

Ops…

Na parte javascript está certo, verifique a maneira como você está lendo o parâmetro “id”, deve ser algo como

request.getParameter(“idCliente”)

E outra coisa, se o campo cliente for do tipo char na tabela você deve colocar o texto entre aspas simples. Não conheço MySQL mas no Oracle seria assim:

rs = st.executeQuery("SELECT * FROM Contato WHERE cliente = ’ " + id + " ’ ");

Blz?

Olá,

Eu pego o idCliente assim:

String idCliente = request.getParameter(“idCliente”)==null?“0”:request.getParameter(“idCliente”);

request.setAttribute(“contato_cliente”, cDAO.findAllByCliente(idCliente));

E o find…:

public Collection findAllByCliente(String id) throws Exception {
// TODO Auto-generated method stub
Connection conn = null;
Statement st = null;
ResultSet rs = null;
LinkedList contatos = new LinkedList();
try {
conn = Pool.getConnection();
st = conn.createStatement();
rs = st.executeQuery(“SELECT * FROM Contato WHERE cliente = '” + id + “’”);
while (rs.next())
contatos.add((Contato)createObject(rs));
} finally {
Util.freeResources(new Object[] { conn, st, rs });
}
return contatos;
}

E continua dando erro:

http://localhost:8080/polo/servlet/Controller?cmd=abrirhistoricocontatos&idCliente=centro%20apta%20citros

Então tenta isso:

rs = st.executeQuery("SELECT * FROM Contato WHERE cliente = " " + id + “” ");

Blz?

Assim:

rs = st.executeQuery(“SELECT * FROM Contato WHERE cliente = “” + id + “””);

Não funcionou também.

Que tipo de coluna é ‘cliente’ na tabela Contato?

Se for number esquece, só vai funcionar com número.

Se for char (varchar2/string), deveria funcionar, mas coloque uma mensagem para depurar o conteúdo da variável idCliente.

Note que no seu exemplo de URL o parâmetro está sendo passado com espaço em branco e o browser substitui isso por %20 tantos espaços em branco quantos ele encontrar.

Eentão, veja se o request está retornando %20 ou realmente espaço em branco.

Se não tiver, adicione a seguinte linha no início da sua página .jsp:
<% @ page contentType=“text/html” %>

Olá,

É do tipo VARCHAR(45).

Printei o request e mostra apenas espaço em branco:
cliente x.

Tentei adicionar <% @ page contentType=“text/html” %>, mas nem carrega o jsp.

Putz, então, acabaram-se minhas tentativas.

Não sei mais o que fazer não pois não conheço MySQL.

Faça o que a mensagem de erro sugere, leia o manual.

Mas antes de tudo, imprima o conteúdo da string SQL já com o valor do request e jogue isso no seu console SQL pra ver se ocorre o mesmo erro.

Boa sorte.