Alterar jtable[Quase resolvido =( ]

29 respostas
P
ola, alguem poderia me explicar como eu faço para editar o conteudo de uma linha especifica da jtable e alterar no banco de dados. Já tentei usar getvalueat o meu problema é que na jtable ele altera so akela linha que é o certo mas no banco altera tudo daquela coluna!!! meu codigo é este
table.getModel().addTableModelListener(new TableModelListener() {

				@Override
				public void tableChanged(TableModelEvent arg0) {

					try
					{
						System.out.println("UPDATE financeiro SET valor_entrada ='"+table.getModel().getValueAt(table.getSelectedRow(),0 )+"',valor_total ='"+table.getModel().getValueAt(table.getSelectedRow(), 1)+"',parcelas='"+table.getModel().getValueAt(table.getSelectedRow(), 2)+"',observacao ='"+table.getModel().getValueAt(table.getSelectedRow(),3 )+"',valor_parcela ='"+table.getModel().getValueAt(table.getSelectedRow(),4 )+"' '"+"' WHERE rc_aluno='"+t2.getText()+"' ");
						comando.executeUpdate("UPDATE financeiro SET valor_entrada ='"+table.getModel().getValueAt(table.getSelectedRow(),0 )+"',valor_total ='"+table.getModel().getValueAt(table.getSelectedRow(), 1)+"',parcelas='"+table.getModel().getValueAt(table.getSelectedRow(), 2)+"',observacao ='"+table.getModel().getValueAt(table.getSelectedRow(),3 )+"',valor_parcela ='"+table.getModel().getValueAt(table.getSelectedRow(),4 )+"' '"+"' WHERE rc_aluno='"+t2.getText()+"' ");   

					}
					catch(Exception e)
					{
						JOptionPane.showMessageDialog(null, "Problema ao alterar dados!");
						e.printStackTrace();
					}
				}
			});
alguém pode me ajudar a encontrar o erro? mto obg

29 Respostas

visola

Eu acho que o seu problema pode estar no valor que está usando para selecionar quais registros serão atualizados. Você garante que rc_aluno é único para cada aluno? Se não for, o UPDATE será executado para todos os registros para o qual a cláusula where retorne true. Pegue o SQL que está sendo gerado no console e copie a cláusula where para um select e veja se apenas um registro é retornado.

Além disso, existem uma série de otimizações que você pode fazer no seu código que facilitaria muito a leitura e a manutenção, como:

  • usar um StringBuilder para construir sua consulta (e fazê-lo somente uma vez, usando a mesma String para o system.out e o executeUpdate)
  • usar um PreparedStatement para evitar problemas de SQLInjection, tem um artigo aqui sobre isso.
P

obrigada pelas dicas visola
e pelo artigo tmbm
em relação as perguntas sim o rc_aluno é unico

S

porque esta fazendo num pintln?, pra executar uma query voce deve usar uma string.

P

olá super_swinger,
eu estou usando o println apenas para verificar se estava pesquisando de forma correta,apenas para teste
mas o que eu realmente gostaria de saber é como não alterar todos os itens da coluna no banco e sim apenas o que for alterado na tabela

visola

Só para esclarecer, o que você queria era atualizar apenas a coluna do registro que o usuário atualizou na tabela? Você já está atualizando apenas um registro, mas pelo SQL que está gerando está atualizando várias colunas, é esse o seu problema?

Se for, poderia usar um switch usando o getColumn do evento, para saber qual coluna foi alterada, acho que algo do tipo:

StringBuilder sql = new StringBuilder("UPDATE financeiro SET ");

switch (evento.getColumn()) {
   case 0:
      sql.append("valor_entrada = '");
      sql.append(table.getModel().getValueAt(table.getSelectedRow(),0 ));
      sql.append("'");
      break;
   case 1:
      ... // um case para cada coluna
}

sql.append(" WHERE rc_aluno='");
sql.append(t2.getText());
sql.append("'");

String update = sql.toString();
System.out.println(update);
comando.executeUpdate(update);
P

ola visola,
obrigada pelas explicações consegui resolver o problema usando switch conforme voce havia me explicado!!
obrigada
=]

P
todas as alterações estavam ocorrendo de forma correta até que percebi que os itens do case 0 e 1 não estão funcionando como os ultimos cases eu fiz algo errado no codigo?
table.getModel().addTableModelListener(new TableModelListener() {

				@Override
				public void tableChanged(TableModelEvent arg0) {
					StringBuilder sql = new StringBuilder("UPDATE nota SET ");  

					switch (arg0.getColumn()) {  
					case 0:  
						sql.append("nota = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 ));  
						sql.append("'");  
						break;  
					case 1:  
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),3 ));  
						sql.append("'");  
						break;
					case 2:
						sql.append("observacao = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),4 ));  
						sql.append("'");  
						break;


					}  

					sql.append(" WHERE rc_aluno='");  
					sql.append(t0.getText()); 
					sql.append("'");
					

					String update = sql.toString();  
					System.out.println(update);  
					try {
						comando.executeUpdate(update);
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
alguem pode me ajudar só funciona o case 2 =( obg
P

ocorre este erro

UPDATE nota SET WHERE rc_aluno='5' com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'WHERE rc_aluno='5'' at line 1
dai o campo que quero trocar não aparece no cod sql=( fica vazio

P

troquei os cases de lugares mas realmente só funciona o case 2
=(
pq?tipo não deveria funcionar todos os cases de acordo com a linha selecionada na tabela?
ja chequiei as colunas e parecem estar corretas…
o que posso fazer para arrumar isto?
obg

drsmachado

Nota e atividade são colunas que aceitam qual tipo de parâmetro? Numérico ou literal (varchar, char, text)?

P

ola drsmachado,

Nota e atividade são colunas que aceitam parametros do tipo literal (varchar)
=]

drsmachado

Faz um println da variável sql nos cases 0 e 1 e posta aqui, pra vermos o que o banco tá recebendo, bele?

ViniGodoy

Nossa, quanto trabalho. Será pq algumas pessoas insistem em usar o DefaultTableModel?

P

bem o print do case 0 fica assim

e logo abaixo o erro

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'WHERE rc_aluno='5'' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583) at telaVisualizacaoDeNotas$9.tableChanged(telaVisualizacaoDeNotas.java:572) ...
dai o case 1 fica assim

e abaixo ocorre o mesmo erro acima

pq os campos das colunas ficam vazios?
obg

drsmachado

Ok,

UPDATE nota SET WHERE

Tá aqui o erro.
Set o que?
O MySQL não sabe qual coluna preencher com o novo valor, este é o erro de sintaxe.
Parece que os trechos

sql.append("nota = '");

e

sql.append("atividade = '");

não estão funcionando.
Faça um teste, concatenando com o bom e velho

sql += "nota = '";
P

ok mas como eu faço para arrrumar isto,tipo pq so aparece ascolunas no case 2?
obg

drsmachado

Você pode trocar para

sql.concat("nota = '");
P

drsmachado
bah naum sei o q fiz errado mas agora da erro nos 3 cases tipo
eu tentei assim

case 2: sql.toString().concat("nota = '"); sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 )); sql.append("'"); System.out.println("nota = '"+table.getModel().getValueAt(table.getSelectedRow(),2 )+"'"); break;
deixando os outros cases iguais mas deu erro de sintaxe no cod mysql em todos os cases e eles apareceram vazios tmbm,dai usei o sql.toString().concat("observacao = '"); //case 0 sql.toString().concat("atividade = '");//case 1
mas continua dando erro de sintaxe =(
o q fiz errado?
obg

drsmachado

Como está ficando a string, depois de concatenada?
No mesmo formato?

P

no print continua vazio o campo q deveria aparecer a coluna
foi isto q tu perguntaste?

P

naum sei se isto vai ajudar a descobrir o erro mas coloquei o case 1 como case 3 tipo copiei exatamente a mesma coisa e funcionou
não entendi pq ?e dai o print no case 3 ficou

tipo agora so funciona o case 2 e 3!
barbaridade!!

drsmachado

Exatamente.
Muito estranho isto.
Faz o seguinte, pode ser problema com o StringBuilder, altera a variável sql para String mesmo e testa.

visola

Você debugou o código? Pela saída, parece que não está passando pelo case 0 nem 1.
Coloca um default nesse case aí para ver se ele está passando por lá:

switch ... {
   // ...
   default:
      System.out.println(arg0.getColumn());
}
P

ok visola,
obrigada
mas olha so alem disto tm um outro probleminha tipo quand eu altero um valor na minha jtable eu altero no banco mas ele altera desordenadamente eu acho que a unica maneira de controlar isto seria usando o id mas como?
obg

P

visola
este system não aparece nada
=(
tipo eu usei akele cod antes dos cases,coloquei no lugar errado?
obg

drsmachado

Somente nos cases 0 e 1 apresenta problema?

P

tipo para tentar alterar de acordo com o id eu tentei fazer algo mais ou menos assim

resultado = comando.executeQuery("select Id,atividade from nota where rc_aluno='"+ t0.getText() +"'"); while(resultado.next()) { key[0][q]=resultado.getObject(1).toString(); key[1][q]=resultado.getObject(2).toString(); q++; }
antes de selecionar os itens do banco para aparecer na jtable
dai apos os cases fiz o seguinte

for(int i=0;i<key.length;i++) { if(key[i][i]!=null || key[0][i]!=null || key[1][i]!=null) { sql.append("and Id='"); sql.append(key[i][0]); sql.append("'"); sql.append(" and atividade='"); sql.append(key[i][1]); sql.append("'"); } }
só que naum da certo pq ele acaba alterando tudo por causa do for como eu faço para relacionar o id do vetor key com as colunas da jtable?
obg

P

sim drsmachado,
so os cases 0 e 1 que dão problema os outros funcionam,mas pq sera neh?

drsmachado
case 0:  
						sql.append("nota = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 ));  
						sql.append("'");  
						break;  
					case 1:  
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),3 ));  
						sql.append("'");  
						break;
					case 2:
						sql.append("observacao = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),4 ));  
						sql.append("'");  
						break;

Já verificou se o parâmetro que você passa entra no switch?
Pois, quando checamos os cases 0, 1 e 2, nada há de errado.
Provavelmente o arg0.getColumn esteja trazendo valores maiores que 1…

Criado 28 de janeiro de 2011
Ultima resposta 7 de fev. de 2011
Respostas 29
Participantes 5