Update row

di il
7 risposte

Update row

In una Jtable modifico i valori di una cella di una data riga, come faccio in modo che vi sia l'update della riga di database?

7 Risposte

  • Re: Update row

    JJhon ha scritto:


    In una Jtable modifico i valori di una cella di una data riga, come faccio in modo che vi sia l'update della riga di database?
    Purtroppo la tua domanda può avere molte risposte. E richiede altre domande. Quale table model hai usato? Ne hai implementato uno "custom" o hai usato es. DefaultTableModel? Quale API usi per l'accesso al DB? Direttamente JDBC? Oppure altro (es. Hibernate/JPA)?
    Vuoi fare l'update subito appena l'edit di una cella termina? O ad esempio quando si passa ad un'altra riga o magari a seguito di altro evento (es. un pulsante "Salva")?
  • Re: Update row

    A me interessava aggiornare la riga una volta deselezionata la stessa, sopratutto, naturalmente in caso di inserimento di una nuova riga. Comunque nel caso di un Update può andar bene anche l'aggiornamento della singola cella.

    Ho provato con questo codice:
    conn = DriverManager.getConnection("jdbc:hsqldb:file:" + Path + "/dbase/opto","ba","");
    st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    rs=st.executeQuery("SELECT ID,LADATA,DESCRIZIONE,....
    ......
    public void tableChanged(TableModelEvent e) {
    if (e.getType() == TableModelEvent.UPDATE) {
    try{ int row=GridPNota.getSelectedRow();
    int id= (int) GridPNota.getValueAt(row,0);
    voce=Grid.getValueAt(row,2).toString()
    rs.absolute(id);
    rs.updateDate("LADATA",datasql);
    rs.updateString("DESCRIZIONE",voce);
    ......
    rs.updateRow();
    ma non riesco ad ottenere l'update.
    Ho provato un'altra strada:
    conn = DriverManager.getConnection("jdbc:hsqldb:file:" + Path + "/dbase/opto","ba","");
    PreparedStatement ps = conn.prepareStatement("UPDATE \"pnota\" SET DESCRIZIONE = ? WHERE ID = " + id);
    ps.setString(1, GridPNota.getValueAt(row,2).toString());
    ps.executeUpdate();
    Ma non riesco ad ottenere l'aggiornamento
  • Re: Update row

    JJhon ha scritto:


    int row=GridPNota.getSelectedRow();
    Qui forse sarebbe meglio ottenere il row dal "firstRow" dell'evento. Ma non è comunque sbagliatissimo come hai fatto.

    Però perché qui usi GridPNota e più sotto invece prendi 'voce' da Grid??

    JJhon ha scritto:


    rs.absolute(id);
    Qui no, serve l'indice della riga nel result-set.... non un ID del record (che probabilmente e presumibilmente non ha nulla a che fare con tale indice).
    E, nota bene, per absolute(), la prima riga è 1.
  • Re: Update row

    
    if (e.getType() == TableModelEvent.UPDATE){
    int row=e.getFirstRow();
    int r=GridPNota.getSelectedRow();
     try{
    conn = DriverManager.getConnection("jdbc:hsqldb:file:" + Path + "/dbase/opto","sa","");
    st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    rs=st.executeQuery("SELECT ID,LADATA,TIP,DESCRIZIONE.....
    rs.absolute(row);
    rs.updateString("DESCRIZIONE",voce);
    rs.updateRow();
    
    Non cavo un ragno dal buco
    Il codice qui sopra non funziona proprio.
    il riferimento di row per absolute è corretto?
  • Re: Update row

    JJhon ha scritto:


    Non cavo un ragno dal buco
    Il codice qui sopra non funziona proprio.
    Se si vuole sfruttare la tecnica dei result-set scrollable e updatable, allora: prima si esegue la query, poi si visualizzano i dati e poi (sempre tenendo "vivo" il ResultSet, cioè tenendolo referenziato e senza farci alcun close, chiaramente), vai alla riga x, aggiorni la/e colonna/e e poi fai updateRow().

    JJhon ha scritto:


    il riferimento di row per absolute è corretto?
    L'indice di riga in JTable/XyzTableModel è zero-based. L'indice di riga per absolute() (e per JDBC in generale) è one-based.

    E comunque, giusto per chiarezza, se nella tua tabella grafica l'utente può inserire delle nuove righe che nel result-set non ci sono, devi fare qualcosa di più perché quanto fai non basterebbe.
  • Re: Update row

    Alla fine questo funziona in quanto la query seleziona la row con quel dato id:
    
    int id=(int)GridPNota.getValueAt(row,0);
     PreparedStatement ps = conn.prepareStatement("UPDATE \"pnota\" SET TIP=?,DESCRIZIONE=? WHERE ID = " + id);      
    ps.setString(1,GridPNota.getValueAt(row,2).toString());
    
    .....
    Se comunque aggiungo alla query la colonna 3 (in query:,ENTRATECASSA=?) per inserire un valore double, come da tabella di database:
    ps.setDouble(3,Double.parseDouble(GridPNota.getValueAt(row,4).toString());
    oppure
    ps.setDouble(3,Double.valueOf(GridPNota.getValueAt(row,4).toString());
    Mi da NumberFormatException. Nella mia cel il valore inserito è 450,00

    Nota:il numero di colonna del get si differenzia dal set, ma è corretto.
  • Re: Update row

    JJhon ha scritto:


    Alla fine questo funziona in quanto la query seleziona la row con quel dato id:
    
    int id=(int)GridPNota.getValueAt(row,0);
     PreparedStatement ps = conn.prepareStatement("UPDATE \"pnota\" SET TIP=?,DESCRIZIONE=? WHERE ID = " + id);      
    ps.setString(1,GridPNota.getValueAt(row,2).toString());
    
    Così però non sfrutti i ResultSet scrollable & updatable.

    JJhon ha scritto:


    Se comunque aggiungo alla query la colonna 3 (in query:,ENTRATECASSA=?) per inserire un valore double, come da tabella di database:
    ps.setDouble(3,Double.parseDouble(GridPNota.getValueAt(row,4).toString());
    oppure
    ps.setDouble(3,Double.valueOf(GridPNota.getValueAt(row,4).toString());
    Mi da NumberFormatException. Nella mia cel il valore inserito è 450,00
    parseDouble/valueOf si aspettano SOLO un formato inglese, ovvero con il '.' come separatore dei decimali.
    Se vuoi gestire numeri "localizzati" in altre lingue, devi passare per i NumberFormat/DecimalFormat.
Devi accedere o registrarti per scrivere nel forum
7 risposte