[MySQL via JDBC] SQL Exception: Column count doesn't match

Pagina: 1
Acties:

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Ik krijg steeds een "Column count doesn't match value count at row 1" error, terwijl ik precies de kolommen over heb genomen uit mijn database. Ik heb ook geprobeerd de value voor de eerste kolom met '' aan te duiden maar nu staat er dus eerst een count die opgehoogd wordt met een om zelf dat ID aan te maken (die kolom numbers is key en auto-increment in MySQL, volgens mij hoeft dat niet eens dus).

Dit is het stukje code wat de query aanstuurt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        if (e.getActionCommand() == "Accept this Character") {
            String pw1s = new String((playerPassword1.getPassword()), 0, ((playerPassword1.getPassword()).length));
            String pw2s = new String((playerPassword2.getPassword()), 0, ((playerPassword2.getPassword()).length));
            if ((playerName.getText()).length() >= 5) {
                if (pw1s.equals(pw2s)) {
                    if (pw1s.length() >= 5) {
                        player = new Player(characterCreator.getStrength(), characterCreator.getSpeed(), characterCreator.getPrecision(), characterCreator.getSocial(), characterCreator.getIntelligence(), playerName.getText());
                        int newRecordNumber = sql.getAmountOfRecords("players") + 1;
                        String query = "insert into players (number, name, strength, speed, precision, intelligence, social, password) values (3, '" + player.getName() + "', " + player.getStrength() + ", " + player.getSpeed() + ", " + player.getPrecision() + ", " +  player.getSocial() + ", " + player.getIntelligence() + ", '" + pw1s + "')";
                        System.out.println(query);
                        sql.setData("insert into players values ('" + player.getName() + "', '" + player.getStrength() + "', '" + player.getSpeed() + "', '" + player.getPrecision() + "', '" +  player.getSocial() + "', '" + player.getIntelligence() + "', '" + pw1s + "')");
                        allSwitchTo(mainguiview);
                    }
                    else JOptionPane.showMessageDialog(null, "Password must be at least 5 characters!", "Password error", JOptionPane.ERROR_MESSAGE);
                }
                else JOptionPane.showMessageDialog(null, "Passwords do not match!", "Password error", JOptionPane.ERROR_MESSAGE);
            }
            else JOptionPane.showMessageDialog(null, "Player name at least 5 characters!", "Character name error", JOptionPane.ERROR_MESSAGE);
            pw1s = "";
            pw2s = "";
        }


Dit is de String die bij de System.out.println te zien krijg in de bovenstaande code:
insert into players (number, name, strength, speed, precision, intelligence, social, password) values (3, '12345', 13, 11, 15, 10, 12, '12345')
Dit is het stukje code wat het aantal records telt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public int getAmountOfRecords(String table) {
        int resultCount = 0;
        try {
            rs = stmt.executeQuery("SELECT COUNT(*) FROM Players");
            rs.next();
            int count = rs.getInt(1);
        }
        catch (SQLException se) {
            // Inform user of any SQL errors
            System.out.println("SQL Exception: " + se.getMessage());
            se.printStackTrace(System.out);
            resultCount = 0;
        }
        return resultCount;
    }


Dit is de code die het weg schrijft:

Java:
1
2
3
4
5
6
7
8
9
10
    public void setData(String query) {
        try {
            stmt.executeUpdate(query);
        }
        catch (SQLException se) {
            // Inform user of any SQL errors
            System.out.println("SQL Exception: " + se.getMessage());
            se.printStackTrace(System.out);
        }
    }


Dit is de tabel waar het in gaat:

code:
1
2
3
4
5
6
7
mysql> select * from players;
+--------+-------+----------+-------+-----------+--------+--------------+----------+
| number | name  | strength | speed | precision | social | intelligence | password |
+--------+-------+----------+-------+-----------+--------+--------------+----------+
|      1 | 0     |        0 |     0 |         0 |      0 |            0 |          |
|      2 | test |        0 |     0 |         0 |      0 |            0 | test    |
+--------+-------+----------+-------+-----------+--------+--------------+----------+


En dit is de fout die ik krijg tijdens runtime:

code:
1
2
3
4
5
6
7
8
java.sql.SQLException: Column count doesn't match value count at row 1
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1622)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:2370)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1289)
        at sud.SqlConnector.setData(SqlConnector.java:76)


Sorry voor de lappen code, maar ik maak het toch vaker mee dat een fout heel ergens anders zit dan je verwacht.

[ Voor 7% gewijzigd door NMe op 11-04-2005 10:49 . Reden: Code tag gefixt ]

iOS developer


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 08-05 12:31
MySQL is zo idioot op de SQL specs niet over te nemen. SQL is case insensitive

hier zit dus de fout:
code:
1
rs = stmt.executeQuery("SELECT COUNT(*) FROM Players");


Players != players

verander naar
code:
1
rs = stmt.executeQuery("SELECT COUNT(*) FROM players");

  • djantje
  • Registratie: Januari 2000
  • Laatst online: 29-11-2025
Kijk eens naar regel 9 en regel 11, je maakt eerst de String query = "..."; die gebruik je niet, doe je sql.setdata("..."); daar wil je dezelfde query in hebben, maar je stopt er een andere in, daar vergeet je namelijk number, volgens mij.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Ik zag nog wat meer kleine foutjes zoals:

int count = rs.getInt(1);

....en dan:

return resultCount

--------

Maar goed met dat opgelost, werkt het nog steeds niet. De fout kom ook pas bij de INSERT.

iOS developer


  • Onno
  • Registratie: Juni 1999
  • Niet online
BikkelZ schreef op zaterdag 09 april 2005 @ 19:29:
Java:
1
2
3
String query = "insert into players (number, name, strength, speed, precision, intelligence, social, password) values (3, '" + player.getName() + "', " + player.getStrength() + ", " + player.getSpeed() + ", " + player.getPrecision() + ", " +  player.getSocial() + ", " + player.getIntelligence() + ", '" + pw1s + "')";
System.out.println(query);
sql.setData("insert into players values ('" + player.getName() + "', '" + player.getStrength() + "', '" + player.getSpeed() + "', '" + player.getPrecision() + "', '" +  player.getSocial() + "', '" + player.getIntelligence() + "', '" + pw1s + "')");
Waarom zit je twee keer die query op te bouwen? En welke gebruik je? De tweede heeft namelijk een kolom minder dan de eerste...

En gebruik alsjeblieft prepared statements, dit is onoverzichtelijk en erg foutgevoelig. :)

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
djantje schreef op zaterdag 09 april 2005 @ 19:38:
Kijk eens naar regel 9 en regel 11, je maakt eerst de String query = "..."; die gebruik je niet, doe je sql.setdata("..."); daar wil je dezelfde query in hebben, maar je stopt er een andere in, daar vergeet je namelijk number, volgens mij.
Het ziet er nu zo uit:

Java:
1
2
3
4
5
6
7
8
9
                    if (pw1s.length() >= 5) {
                        player = new Player(characterCreator.getStrength(), characterCreator.getSpeed(), characterCreator.getPrecision(), characterCreator.getSocial(), characterCreator.getIntelligence(), playerName.getText());
                        int newRecordNumber = sql.getAmountOfRecords("players") + 1;
                        System.out.println(newRecordNumber);
                        String query = "insert into players (number, name, strength, speed, precision, intelligence, social, password) values (" + newRecordNumber + ", '" + player.getName() + "', " + player.getStrength() + ", " + player.getSpeed() + ", " + player.getPrecision() + ", " +  player.getSocial() + ", " + player.getIntelligence() + ", '" + pw1s + "')";
                        System.out.println(query);
                        sql.setData(query);
                        allSwitchTo(mainguiview);
                    }


Resultaat:

code:
1
2
3
4
5
6
7
8
3
4
insert into players (number, name, strength, speed, precision, intelligence, soc
ial, password) values (4, '123123', 12, 12, 8, 11, 7, '123123')
SQL Exception: You have an error in your SQL syntax; check the manual that corre
sponds to your MySQL server version for the right syntax to use near 'precision,
 intelligence, social, password) values (4, '123123', 12, 12, 8, 11, 7' at line
1


Hmm.....

iOS developer


  • Onno
  • Registratie: Juni 1999
  • Niet online
Reserved keyword.

(btw, je kent mysql.com/doc?)

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Volgens mij gaat SQL over zijn nek van het mixen van INT's en VAR's.

Dit geeft het zelfde probleem als ik het op de MySQL console doe, maar losse INSERT's van een enkele kolom weer niet.

Edit:
Bomen, bos ;)

Het werkt, bedankt!

[ Voor 45% gewijzigd door BikkelZ op 09-04-2005 20:04 ]

iOS developer


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Onno schreef op zaterdag 09 april 2005 @ 19:42:
En gebruik alsjeblieft prepared statements, dit is onoverzichtelijk en erg foutgevoelig. :)
Prepared statements, werken die ook samen met je database driver mits dat ondersteund wordt door de onderliggende database? Of blijft het puur in Java?

Prepared statements worden volgens mij ook in MySQL gebruikt, en hebben dan wel een performancevoordeel.

iOS developer

Pagina: 1