Moi!
Pikku ongelman edessä painin jo toista päivää...eli vedonlyöntiohjelmassa on JTable, johon tuodaan tietokannasta dataa. Pystyykö taulukon tietoja editoimaan, niin että muokatut tiedot päivitettäisiin myös tietokantaan? Tietojen näyttö JTablessa toimii. Olisin erittäin kiitollinen avusta.
private JTable field1;
private String [] columnNames ={"Sijoitus","Joukkue","Voimaluku","Kotivoima","Vierasvoima"};
private Object[][] data;
private JComboBox league;
private JButton editLeague;
private JScrollPane spField1;
private Connection con;
private PreparedStatement sqlPremierLeague;
private PreparedStatement sqlPremierLeague_update;
/** Creates a new instance of CreatePage1
** Formats SQL connection and querys*/
public Page1() throws Exception
{
setConnection();
sqlPremierLeague = con.prepareStatement(" SELECT * FROM valioliiga ");
sqlPremierLeague_update = con.prepareStatement("UPDATE valioliiga SET sijoitus = ?, joukkue = ?, voimaluku = ?, kotivoima = ?, vierasvoima = ?");
}
private void setConnection() throws Exception
{
String driver ="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/sarjataulukot";
Class.forName( driver ).newInstance();
con = DriverManager.getConnection( url , "root", "");
Statement stm = con.createStatement();
con.setAutoCommit( false );
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
Object choosenLeague = league.getSelectedItem();
if (source == editLeague)
{
field1.setEnabled(true);
}
****Päivittää tietokannan vastaamaan taulukon arvoja = EI TOIMI****
if (source == update)
{
if (choosenLeague.equals("Valioliiga"))
{
try
{
int tulos;
for(int i=0;i
Pikku ongelman edessä painin jo toista päivää...eli vedonlyöntiohjelmassa on JTable, johon tuodaan tietokannasta dataa. Pystyykö taulukon tietoja editoimaan, niin että muokatut tiedot päivitettäisiin myös tietokantaan? Tietojen näyttö JTablessa toimii. Olisin erittäin kiitollinen avusta.
private JTable field1;
private String [] columnNames ={"Sijoitus","Joukkue","Voimaluku","Kotivoima","Vierasvoima"};
private Object[][] data;
private JComboBox league;
private JButton editLeague;
private JScrollPane spField1;
private Connection con;
private PreparedStatement sqlPremierLeague;
private PreparedStatement sqlPremierLeague_update;
/** Creates a new instance of CreatePage1
** Formats SQL connection and querys*/
public Page1() throws Exception
{
setConnection();
sqlPremierLeague = con.prepareStatement(" SELECT * FROM valioliiga ");
sqlPremierLeague_update = con.prepareStatement("UPDATE valioliiga SET sijoitus = ?, joukkue = ?, voimaluku = ?, kotivoima = ?, vierasvoima = ?");
}
private void setConnection() throws Exception
{
String driver ="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/sarjataulukot";
Class.forName( driver ).newInstance();
con = DriverManager.getConnection( url , "root", "");
Statement stm = con.createStatement();
con.setAutoCommit( false );
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
Object choosenLeague = league.getSelectedItem();
if (source == editLeague)
{
field1.setEnabled(true);
}
****Päivittää tietokannan vastaamaan taulukon arvoja = EI TOIMI****
if (source == update)
{
if (choosenLeague.equals("Valioliiga"))
{
try
{
int tulos;
for(int i=0;i
Vastaukset 5
Vanhimmat
Mitä kohtaa tuosta koodissa pitäisi katsoa? No, oletan että vain tuota "...EI TOIMI..." kohtaa. Miksi yrität päivittää vain joka toisen "rivin" tiedot eli miksi rivin "con.commit()" jälkeen on rivi: "i "?
Onko ongelma se että, saat sen JTablen sisällön muuttumaan ruudulla, mutta sitten update toimintossa olevat SQL lauseet eivät näytä vaikuttavan tietokantaan? Palauttaako "field1.getValueAt(?,?)" metodi sen taulukon uuden päivitetyn arvon? Mitään exceptioneita ohjelma ei siis heittele? Kokeile sulkea kaikki statementit ja tietokanta yhteys heti updaten jälkeen ja käy katsomassa että eikö tosiaankaan muutos mennyt tietokantaan asti...
kiitos vastauksesta! Sain tietokannan tallentamaan muuttuneet tiedot, mutta se tallentaa ainoastaan ensimmäisen rivin!?! For-silmukka on mielestäni oikein vaiko ei?
private void updateLeague(PreparedStatement ps)
{
try
{
int tulos;
ps=ps;
for(int i=0;i
Kyllä se for silmukka näyttää olevan oikein. Lisää sinne silmukkaan tulostus komento, niin näet sitten näytöltä sen että käykö se kaikki taulukon rivit läpi. Jos se kuitenkin nyt käy koko taulukon läpi, niin silloin se virhe voisi viitata tuohon "commit()" juttuun. Mitä jos otat ne "commit()" ja "setAutoCommit(false)" rivit pois, niin toimiiko ohjelma silloin oikein?
Kokeile vielä tehdä siten että kun käynnistät ohjelman, niin muokkaa heti tämän jälkeen toista riviä ja paina sitten update nappia, josko niin toinen rivi päivittyisi. (Eli ajatuksena että virhe olisikin se että vain ensimmäinen muutos päivittyy))
No moro taas. Tietokantahan on muotoa sijoitus(varchar), joukkue(varchar)(Primary Key), voimaluku(double), kotivoima(double), vierasvoima(double). Otin pois tuo avaimen ja silloin silmukka toimi, eli kävi kaikki rivit läpi. Huonona puolena tosin uudestaan avatatessa oli hävittänyt kaikki rivit...commit() ja setAutoCommit() rivit poisottaessa ohjelma kaatuu update-nappia painaessa. Eli en saa vieläkään sitä käymään koko taulua läpi järkevästi. Muita rivejä ei saa tallennettua vaikka muokkaisi sitä ensimmäisenä ja päivittäisi tietokannan.
Minkälainen se UPDATE lausekkeesi nyt loppujen lopuksi on? Eikös sen pidä olla seuraavan kaltainen ja ne "ps.setX(...)" jutut vastaavan mukaisesti:
"UPDATE valioliiga SET sijoitus = ?, voimaluku = ?, kotivoima = ?, vierasvoima = ? WHERE joukkue = ?"
En kiinnittynyt tuohon, ei järkevään, UPDATE lauseeseen huomiota tuossa ensimmäisessä viestissäsi, koska oletin että ohjelma olisi ajonaikaisilla virheillä kyllä siitä kertonut.