E aí pessoal, tranquilo?
Bom, é a primeira vez que posto aqui no Fórum, primeiro gostaria de agradecer a todos, pois me ajudaram muito em várias dúvidas que tive. (Eu procurei muito sobre isso mas não tive sucesso, de verdade!).
Enfim vamos lá:
Minha dúvida é a seguinte, eu queria alterar vários IDS de uma vez só. Eu tenho meu UPDATE funcionando normalzinho:
try {
PreparedStatement pst = conecta.conn.prepareStatement("UPDATE encomendas SET entregue=?, datasaida=?, horasaida=?, porteiroentregou=? WHERE id=?");
pst.setString(1, botaoentregue.getText());
pst.setString(2, datasaida.getText());
pst.setString(3, horasaida.getText());
pst.setString(4, (String) comboporteiro.getSelectedItem());
pst.setInt(5, Integer.parseInt(campoid.getText()));
pst.executeUpdate();
JOptionPane.showMessageDialog(rootPane, "Atualizado com Sucesso");
} catch (SQLException ex) {
JOptionPane.showMessageDialog(rootPane, "Erro ao atualizar dados\n ERRO: " +ex);
}
Minha query está funcionando belezinha também.
Explicando melhor, eu quero digitar no meu JTextField os Id’s: 1,2,3 e atualizar todos apertando meu botão.
Obrigado desde já!
Passe uma lista de ID,s para a query SQL, como por exemplo!
Update tabela set coluna = ? where id in(1,2,3,4,5,6);
1 curtida
Jonathan_Medeiros:
Update tabela set coluna = ? where id in(1,2,3,4,5,6);
E aí Jonathan, tudo bem?
Cara, no Postgres até rolou, mas não consegui passar esse comando pro PreparedStatement
Deu esse erro Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: "1,2"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
Meu prepared
PreparedStatement pst = conecta.conn.prepareStatement("UPDATE encomendas SET entregue=?, datasaida=?, horasaida=?, porteiroentregou=? WHERE id in (?,?)");
No caso eu queria que a pessoa que fosse utilizar o software, colocasse no campo “1,2,3,4,5,6” e atualizasse, entende? Nem sempre nessa ordem, com uma ID eu consigo, mas com o IN não
rolou
Já tentou fazer da seguinte forma, recuperando o valor dos ID’s como sendo uma String única ?
Com isso, basta passar essa string como parâmetro para o PreparedStatement
.
Lembrando que ele teria que ir como uma String, pois não teria como converter este valor em Integer.
Exemplo:
PreparedStatement pst = conecta.conn.prepareStatement("UPDATE tabela SET campo=? WHERE id in (?)");
pst.setString(1, valorCampo.getText());
pst.setString(2, campoID.getText());//Aqui já vai existir a lista de ID's como por exemplo (3,9,4,6,8)
1 curtida
Jonathan_Medeiros:
PreparedStatement pst = conecta.conn.prepareStatement(“UPDATE tabela SET campo=? WHERE id in (?)”);
pst.setString(1, valorCampo.getText());
pst.setString(2, campoID.getText());//Aqui já vai existir a lista de ID’s como por exemplo (3,9,4,6,8)
Não funfa também, o pior é que nem erro ele dá, só fala que foi atualizado. Eu coloco lá no jText “1,2” (que são meus únicos dois ID’s) mas quando eu vejo no Postgres, nada muda. Mas valeu cara, vou deixar assim mesmo, vou dar mais trampo pra os caras mesmo hahaha, valeu!
pmlm
Fevereiro 24, 2018, 9:52pm
#7
PreparedStatement pst = conecta.conn.prepareStatement(“UPDATE tabela SET campo=? WHERE id in (?)”);
pst.setString(1, valorCampo.getText());
Array array = conecta.conn.createArrayOf("VARCHAR", new Object[]{"1", "2","3"});
pst.setArray(2, array);
pst.executeUpdate();
pmlm:
PreparedStatement pst = conecta.conn.prepareStatement(“UPDATE tabela SET campo=? WHERE id in (?)”);
pst.setString(1, valorCampo.getText());
Array array = conecta.conn.createArrayOf(“VARCHAR”, new Object[]{“1”, “2”,“3”});
pst.setArray(2, array);
pst.executeUpdate();
E aí cara, tudo bem? Eu fiz isso, mas diz que não foi possível encontrar uma matriz para o nome fornecido
pmlm
Fevereiro 27, 2018, 12:00am
#9
Experimenta com “varchar” em minúsculas. Esta parte é específica da BD e em alguns casos pode ser case sensitive.
Também, da o mesmo erro… Desisti já, vou deixar como estava, mas valeu cara! Abraço.
staroski
Fevereiro 27, 2018, 11:27pm
#11
Até onde sei, PreparedStatement não funciona utilizando parâmetros na cláusula IN.
Então você tem que montar dinamicamente a query, concatenando os elementos a serem utilizado na cláusula IN.
1 curtida
Eu teria que criar então uma classe DAO pra fazer toda essa volta?
Não necessariamente.
Ao invés de escrever:
update tabela set coluna = ? where id in(?);
Você vai ter que escrever:
update tabela set coluna = ? where id in(valor1, valor2, valor3, valorN);
1 curtida
Pacato
Fevereiro 28, 2018, 11:20am
#14
Certa vez tive que fazer umas “gambiarras” dessas:
ps = conn.prepareStatement(CONSULTA_GERAR_ARQUIVO_HISTORICO
+ sql.toString() + " UNION ALL " + CONSULTA_GERAR_ARQUIVO_UNION + sqlAtual.toString() + GROUP2 + ORDER2);
Onde cada palavra com maiúscula, é um trecho da consulta no BD… assim montava a consulta.
private static final String SQL_GERAL = "SELECT CodTecnologia, Operadora, StatusSIMCard , SUM(Quantidade) AS Quantidade FROM ( ";
Pacato
Fevereiro 28, 2018, 11:32am
#15
a classe está grande, mas eu valido tudo, recebo uma lista, monto o IN e retorno a lista de resultado (que no seu caso não precisará, eu acho).
public List<ConsultaGerarRelatorio> listaTecnologias(
List<Integer> tecnologias, List<Integer> operadoras,
List<Integer> status) {
Connection conn = null;
PreparedStatement ps = null;
List<ConsultaGerarRelatorio> listaConsultaGeraRelatorio = new ArrayList<ConsultaGerarRelatorio>();
if (!tecnologias.isEmpty()) {
sql.append(" Dispositivo.CodigoTecnologia IN (");
for (Iterator<Integer> it = tecnologias.iterator(); it.hasNext();) {
it.next();
sql.append("?");
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
}
if (!operadoras.isEmpty()) {
if (!tecnologias.isEmpty()) {
sql.append(" AND SIMCard.CodigoOperadora IN (");
for (Iterator<Integer> it = operadoras.iterator(); it.hasNext();) {
it.next();
sql.append("?");
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
} else {
sql.append(" SIMCard.CodigoOperadora IN (");
for (Iterator<Integer> it = operadoras.iterator(); it.hasNext();) {
it.next();
sql.append("?");
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
}
}
if (!status.isEmpty()) {
if (!tecnologias.isEmpty() || !operadoras.isEmpty()) {
sql.append(" AND SIMCard.CodigoStatusSIMCard IN (");
for (Iterator<Integer> it = status.iterator(); it.hasNext();) {
it.next();
sql.append("?");
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
} else {
sql.append(" SIMCard.CodigoStatusSIMCard IN (");
for (Iterator<Integer> it = status.iterator(); it.hasNext();) {
it.next();
sql.append("?");
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
}
}
sql.append(" )");
try {
conn = ConnectionManager.obterConexao();
ps = conn.prepareStatement(SQL_VIRTUAL + SQL_ATUAL + sql.toString() + GROUP_VIRTUAL + GROUP + ORDER);
int indicePs = 1;
if (!tecnologias.isEmpty()) {
for (Integer i : tecnologias) {
ps.setInt(indicePs++, i);
}
}
if (!operadoras.isEmpty()) {
for (Integer i : operadoras) {
ps.setInt(indicePs++, i);
}
}
if (!status.isEmpty()) {
for (Integer i : status) {
ps.setInt(indicePs++, i);
}
}
//System.out.println("Consulta: " + SQL_ATUAL + sql.toString() + GROUP + ORDER);
//System.out.println(ps);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
ConsultaGerarRelatorio listaRelatorio = new ConsultaGerarRelatorio(
rs.getString("CodTecnologia"),
rs.getString("Operadora"), rs.getString("StatusSIMCard"),
rs.getString("Quantidade"));
listaConsultaGeraRelatorio.add(listaRelatorio);
/*System.out.println(rs.getString("CodTecnologia") + " "
+ rs.getString("Operadora") + " "
+ rs.getString("StatusLinha") + " "
+ rs.getString("Quantidade"));*/
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionManager.fecharConexao(conn, null, ps);
}
return listaConsultaGeraRelatorio;
}
1 curtida
Assim que eu ligar o PC dou uma olhada
Revivendo o tópico só pra ajudar se alguém for precisar disso, é bem simples, na época eu não manjava nada e pra mim tudo era um bicho de 200 cabeças.
Declarei o Array como global: List<String> linhasX = new ArrayList<>();
Bom, pra poder selecionar os Id’s da tabela eu coloquei um MouseClicked :
conecta.conexao();
String identifica = "" + tabela.getValueAt(tabela.getSelectedRow(), 0);
try {
conecta.executaSQL("select * from algumaCoisa where id='" + identifica + "'");
conecta.rs.first();
id = conecta.rs.getInt("id");
campoapto.setText(String.valueOf(conecta.rs.getString("algumaColuna")));
linhasX.add(String.valueOf(id)); //Aqui eu adiciono o meu ID selecionado no array.
} catch (SQLException s) {
s.printStackTrace();
JOptionPane.showMessageDialog(rootPane, "Erro ao selecionar este item. Tente Novamente!");
} finally {
conecta.desconecta();
}
Aqui é pra editar :
List<String> nomes = linhasX;
String todosNomes = String.join(", ", nomes);
conecta.conexao();
try {
PreparedStatement pst = conecta.conn.prepareStatement("UPDATE algumaCoisa SET colunaX= ? WHERE id IN (" + todosNomes + ")");
pst.setString(1, "Teste");
pst.execute();
linhasX.clear(); //Aqui eu limpo o Array
JOptionPane.showMessageDialog(null, "Alterado com Sucesso");
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro ao alterar apartamento. Tente Novamente!");
} finally {
conecta.desconecta();
}
Obrigado pMim, Jonathan, staroski e pacato!!