Alterar jtable[Quase resolvido =( ]

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

[code]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();
				}
			}
		});[/code]

alguém pode me ajudar a encontrar o erro?
mto obg

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.

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

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

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

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);

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

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?

[code]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();
				}  

[/code]
alguem pode me ajudar
só funciona o case 2
=(
obg

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

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

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

ola drsmachado,

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

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

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

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

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 = '";

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

Você pode trocar para

sql.concat("nota = '");

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

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