2016-04-25 8 views
1

Ich versuche meine Tic Tac Toe Spiel Ergebnisse zu einer Datenbank auszugeben. Ich werde jedoch immer wieder auf diesen Fehler stoßen, wenn eine Übereinstimmung zwischen zwei Clients abgeschlossen ist. Hier ist ein Auszug aus meinem Code von der Serverseite und die Fehlermeldung:Syntaxfehler: aufgetreten ";"

Die Database-Klasse:

import java.sql.*; 
    import java.util.*; 
    import javax.swing.JOptionPane; 

    class Database { 

final String JDBC_DRIVER = "org.apache.derby.jdbc.ClientDriver"; 
final String DB_URL = "jdbc:derby://localhost:1527/Mini Project"; 

// Database credentials 
final String USER = "Joe"; 
final String PASS = "plateau"; 

Connection conn; 
Statement stmt; 

public Database() { 

    try { 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 

     System.out.println("Connecting to database..."); 
     conn = DriverManager.getConnection(DB_URL, USER, PASS); 

     //STEP 4: Execute a query 
     System.out.println("Creating statement..."); 
     stmt = (Statement) conn.createStatement(); 

    } catch (SQLException ex) { 
     ex.printStackTrace(); 

    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 

    } 

} 

public User getUser(String userName) { 

    User user = null; 

    try { 
     ResultSet resultSet = stmt.executeQuery("SELECT * FROM PLAYERS"); 

     while (resultSet.next()) { 
      //Retrieve by column name 
      user = new User(resultSet.getInt(1), 
        resultSet.getString(2), 
        resultSet.getString(3), 
        resultSet.getString(4), 
        resultSet.getString(5), 
        resultSet.getString(6)); 
     } 

     resultSet.close(); 

    } catch (SQLException ex) { 
     ex.printStackTrace(); 
     System.err.println(ex.toString()); 
    } 

    return user; 

} 

public Boolean insertPlayer(User player) { 

    Boolean isAdded = false; 

    int DUPLICATE_PRIMERY_KEY_ERROR_CODE = 1062; 

    String sql = "INSERT INTO PLAYERS(Name,Surname,Username,Password,Email) VALUES('" 
      + player.getName() + "','" + player.getSurname() + "','" + player.getUsername() + "','" 
      + player.getPassword() + "','" + player.getEmail() + "','" 
      + "','" + "');"; 

    try { 
     stmt.execute(sql); 
     isAdded = true; 

    } catch (SQLException ex) { 

     isAdded = false; 
     ex.printStackTrace(); 
     System.err.println(ex.toString()); 

     if (ex.getErrorCode() == DUPLICATE_PRIMERY_KEY_ERROR_CODE) { 
      JOptionPane.showMessageDialog(null, "Username with or email already exist"); 
     } 

    } 

    return isAdded; 
} 

public void insertGameResult(Results result) { 

    String igr = "INSERT INTO RESULTS(Name1, Surname1, Name2, Surname2, Winner) VALUES('" 
      + result.getName1() + "','" + result.getSurname1() + "','" + result.getName2() + "','" 
      + result.getSurname2() + "','" + result.getWinner() + "');"; 

    try { 
     Boolean added = stmt.execute(igr);             
     if (added) { 
      JOptionPane.showMessageDialog(null, "Result added successfuly"); 
     } 
    } catch (SQLException ex) { 

     ex.printStackTrace(); 
     System.err.println(ex.toString()); 

    } 

} 
    } 

Die Spielerklasse:

class Player extends Thread { 

    Socket insocket; 
    Socket outSocket; 

    public Player(Socket sock, Socket opnSock) { 
     this.insocket = sock; 
     this.outSocket = opnSock; 

    } 

    @Override 
    public void run() { 

     try { 

      while (true) { 

       InputStream is = insocket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 

       String readData = br.readLine(); 

       OutputStream os = outSocket.getOutputStream(); 
       PrintWriter pw = new PrintWriter(os, true); 
       pw.println(readData); 
       // logTextArea.append(Rdata + "\n"); 

       if (readData.contains("winner*")) { 

        String[] splitData = readData.split(","); 
        String player1 = splitData[1]; 
        String player2 = splitData[2]; 
        int winner = Integer.valueOf(splitData[3]); 

        win += 1; 
        if (win == 2) { 
         saveResult(player1, player2, winner); 

         if (winner == 1) { 
          winner = 2; 
         } else if (winner == 2) { 
          winner = 1; 
         } 

         saveResult(player2, player1, winner); 
         win = 0; 
        } 

       } 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      jtaLog.append(ex.toString() + "\n"); 
     } 
    } 
} 

Das Ergebnis Methode unter der Hauptklasse sparen:

public void saveResult(String username1, String username2, int winner) { 

    User p1 = database.getUser(username1); 
    User p2 = database.getUser(username2); 

    Results result = new Results(0, p1.getName(), p1.getSurname(), p2.getName(), p2.getSurname(), winner); 
    database.insertGameResult(result); 
    } 

Hier ist die Fehlermeldung erhalte ich:

java.sql.SQLSyntaxErrorException: Syntax error: Encountered ";" at line 1, column 98. 
    at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.ClientStatement.execute(Unknown Source) 
    at tictactoeserver.Database.insertGameResult(Database.java:106) 
    at tictactoeserver.TicTacToeServer.saveResult(TicTacToeServer.java:200) 
    at tictactoeserver.TicTacToeServer$Player.run(TicTacToeServer.java:317) 
Caused by: ERROR 42X01: Syntax error: Encountered ";" at line 1, column 98. 
    at org.apache.derby.client.am.ClientStatement.completeSqlca(Unknown Source) 
    at org.apache.derby.client.am.ClientStatement.completeExecuteImmediate(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.parseEXCSQLIMMreply(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.readExecuteImmediate(Unknown Source) 
    at org.apache.derby.client.net.StatementReply.readExecuteImmediate(Unknown Source) 
    at org.apache.derby.client.net.NetStatement.readExecuteImmediate_(Unknown Source) 
    at org.apache.derby.client.am.ClientStatement.readExecuteImmediate(Unknown Source) 
    at org.apache.derby.client.am.ClientStatement.flowExecute(Unknown Source) 
    at org.apache.derby.client.am.ClientStatement.executeX(Unknown Source) 
    ... 4 more 
java.sql.SQLSyntaxErrorException: Syntax error: Encountered ";" at line 1, column 98. 

Was passiert ";" gemein, und was kann ich tun, um es zu korrigieren?

+0

Sie möchten, dass wir Hunderte von Zeilen lesen, um Ihren Syntaxfehler zu finden?!? – jarlh

+0

Warum drucken Sie die SQL-Anweisungen nicht aus, bevor Sie sie ausführen? würde das Debuggen viel einfacher machen. –

+0

Wenn Sie Derby verwenden, warum haben Sie mysql getaggt? –

Antwort

8

What does Encountered ";" mean, and what can I do to rectify it?

Es bedeutet, dass die SQL-Anweisung einen zusätzlichen ; Charakter hat, wo der SQL-Parser nicht ein nicht erwartet. Während Sie normalerweise SQL-Befehle mit einer ; in interaktiven SQL-Shells beenden, müssen Sie sie nicht hinzufügen, wenn Sie SQL-Befehle über JDBC ausführen.

In Ihrem Fall in Ihren INSERT Aussage, entfernen Sie die Hinter ;, zum Beispiel in der insertPlayer() Methode:

... 
+ "','" + "');"; 
      ^

Das gleiche gilt für Ihre insertGameResult() Methode wahr ist (dies ist das eine, die tatsächlich der Stack-Trace ist show):

... 
+ result.getSurname2() + "','" + result.getWinner() + "');"; 
                 ^

Als zusätzliche Anmerkung sollten Sie beim Erstellen von SQL-Anweisungen keine String-Verkettung verwenden. Dies macht die Anweisungen anfällig für SQL injections. Verwenden Sie stattdessen Bind-Variablen.

+0

ja, ich habe das Trailing abgezogen; und nun zeigt es mir etwas wie java.sql.SQLIntegrityConstraintViolationException: Die Spalte 'GAME_NO' kann keinen NULL-Wert akzeptieren. GAME_NO ist eine der Spalten in meiner Ergebnistabelle. – Azaan

+0

Sie können Ihre Tabelle ändern, um 'GAME_NO INTEGER NOT NULL GENERIERT IMMER ALS IDENTITY (START WITH 1, INCREMENT BY 1) hinzuzufügen, damit die Datenbank die Spielnummer für Sie eingibt. Andernfalls müssen Sie die Spielnummer der 'Ergebnisklasse 'hinzufügen. – Stavr00

+0

Sie haben 'GAME_NO' als' NOT NULL' definiert, aber offensichtlich fügen Sie keinen Wert in diese Spalte ein (sie ist nicht in Ihrer 'INSERT'-Anweisung aufgeführt). Ändern Sie entweder die Tabelle, und entfernen Sie die Einschränkung "NOT NULL" oder fügen Sie die Spalte zu Ihrer INSERT-Anweisung hinzu. –